Python Forum
[WxPython] Grid. How to close the cell editor?
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[WxPython] Grid. How to close the cell editor?
#2
It solved my problem

class GridCellColourEditor(wx.grid.GridCellEditor):

    def Create(self, parent, id, evtHandler):
        self._parent = parent
        self._colourDialog = None
        self._colourButton = wx.Button(parent, id, "")
        self.SetControl(self._colourButton)
        newEventHandler = wx.EvtHandler()
        if evtHandler:
            self._colourButton.PushEventHandler(newEventHandler)
        self._colourButton.Bind(wx.EVT_BUTTON, self.OnClick)

    def OnClick(self, event):
        self._colourButton.SetFocus()
        self.ShowColourDialog()

    def SetSize(self, rect):
        self._colourButton.SetSize(rect.x, rect.y,
                                   rect.width + 2, rect.height + 2,
                                   wx.SIZE_ALLOW_MINUS_ONE)

    def Clone(self):
        return GridCellColourEditor()

    def BeginEdit(self, row, col, grid):
        self.startValue = grid.GetTable().GetValue(row, col)
        self.endValue = self.startValue
        self._colourButton.SetBackgroundColour(self.startValue)

        self._grid = grid
        self._row = row
        self._col = col
        self._parent.Bind(wx.EVT_LEFT_DOWN, self.OnParentLeftDown)
        self._parent.Bind(wx.EVT_KILL_FOCUS, self.OnParentKillFocus)

    def EndEdit(self, row, col, grid, oldval):
        self._parent.Unbind(wx.EVT_LEFT_DOWN)
        self._parent.Unbind(wx.EVT_KILL_FOCUS)

        if self.endValue != self.startValue:
            return self.endValue
        else:
            return None

    def ApplyEdit(self, row, col, grid):
        val = self.endValue.GetAsString(wx.C2S_HTML_SYNTAX)
        grid.GetTable().SetValue(row, col, val)

    def Reset(self):
        self._colourButton.SetBackgroundColour(self.startValue)

    def ShowColourDialog(self):
        colourDialog = wx.ColourDialog(self._parent)
        self._colourDialog = colourDialog
        colourDialog.GetColourData().SetColour(self.startValue)
        if colourDialog.ShowModal() == wx.ID_OK:
            data = colourDialog.GetColourData()
            colour = data.GetColour()
            self._colourButton.SetBackgroundColour(colour)
            self.endValue = colour

        self._parent.SetFocus()

        del self._colourDialog
        self._colourDialog = None

    def OnParentLeftDown(self, event: wx.MouseEvent):
        def CheckCellChange():
            row = self._grid.GetGridCursorRow()
            col = self._grid.GetGridCursorCol()
            if self._row == row and self._col == col:
                # клик в области сетки, но ячейка не изменилась
                self._grid.CloseEditControl()
        wx.CallAfter(CheckCellChange)
        event.Skip()

    def OnParentKillFocus(self, event: wx.FocusEvent):
        if self._parent.FindFocus() != self._colourButton:
            self._grid.CloseEditControl()
        event.Skip()
Reply


Messages In This Thread
Grid. How to close the cell editor? - by ioprst - Dec-02-2019, 07:42 AM
RE: Grid. How to close the cell editor? - by ioprst - Dec-03-2019, 09:28 AM

Possibly Related Threads…
Thread Author Replies Views Last Post
  [WxPython] Why does an error occur after editing a grid cell? ioprst 2 2,736 Nov-12-2019, 12:31 PM
Last Post: Larz60+
  Get value of wx grid cell ian 1 8,663 Jul-15-2017, 03:04 AM
Last Post: Larz60+

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020