自定义GridCellEditor崩溃python

时间:2015-10-05 14:04:52

标签: wxpython

我正在尝试设置自定义GridCellEditor 我的配置是Windows 7-64位,Python3.4.3-32bits,wxPython-Phoenix 3.0.3

我采取并改编了wxpython中的示例代码。

CellEditor工作正常,但是当我尝试验证内容时(使用TAB,或点击网格上的其他位置),Python崩溃...

从互联网借来的其他一些代码会造成同样的崩溃(例如here

有人可以帮我吗?


import wx
import wx.grid
import string

class UpCaseCellEditor(wx.grid.GridCellEditor):
    def __init__(self):
        wx.grid.GridCellEditor.__init__(self)

    def Create(self, parent, id, evtHandler):
        self._tc = wx.TextCtrl(parent, id, "")
        self._tc.SetInsertionPoint(0)
        self.SetControl(self._tc)

        if evtHandler:
            self._tc.PushEventHandler(evtHandler)

        self._tc.Bind(wx.EVT_CHAR, self.OnChar)

    def SetSize(self, rect):
        self._tc.SetSize(rect.x, rect.y, rect.width+2, rect.height+2)

    def BeginEdit(self, row, col, grid):
        self.startValue = grid.GetTable().GetValue(row, col)
        self._tc.SetValue(self.startValue)
        self._tc.SetInsertionPointEnd()
        self._tc.SetFocus()
        self._tc.SetSelection(0, self._tc.GetLastPosition())

    def EndEdit(self, row, col, grid):
        changed = False
        val = self._tc.GetValue()
        if val != self.startValue:
            changed = True
            grid.GetTable().SetValue(row, col, val)
        self.startValue = ''
        self._tc.SetValue('')
        return changed

    def Reset(self):
        self._tc.SetValue(self.startValue)
        self._tc.SetInsertionPointEnd()

    def Clone(self):
        return UpCaseCellEditor()

    def StartingKey(self, evt):
        self.OnChar(evt)
        if evt.GetSkipped():
            self._tc.EmulateKeyPress(evt)

    def OnChar(self, evt):
        key = evt.GetKeyCode()
        if key > 255:
            evt.Skip()
            return
        char = chr(key)
        if char in string.ascii_letters:
            char = char.upper()
            self._tc.WriteText(char)
        else:
            evt.Skip()


class TestFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="Grid Editor",
                             size=(640,480))
        grid = wx.grid.Grid(self)
        grid.CreateGrid(50,50)
        grid.SetCellEditor(0, 0, UpCaseCellEditor())

app = wx.App()
frame = TestFrame()
frame.Show()
app.MainLoop()      

我尝试过使用PyGridCellEditor(据说不推荐使用?)


>>> import wx
>>> wx.grid.PyGridCellEditor
class 'wx.core.deprecated.locals.DeprecatedClassProxy'

顺便说一下,我遇到了与PyGridCellEditor相同的问题。随着python崩溃,我没有从空闲中得到任何回溯。我唯一的信息来自Windows:

Signature du problème :
  Nom d’événement de problème:  APPCRASH
  Nom de l’application: pythonw.exe
  Version de l’application: 0.0.0.0
  Horodatage de l’application:  54ecf082
  Nom du module par défaut: _core.pyd
  Version du module par défaut: 0.0.0.0
  Horodateur du module par défaut:  55cb1a46
  Code de l’exception:  c0000005
  Décalage de l’exception:  00012fa5
  Version du système:   6.1.7601.2.1.0.256.48
  Identificateur de paramètres régionaux:   2060
  Information supplémentaire n° 1:  0a9e
  Information supplémentaire n° 2:  0a9e372d3b4ad19135b953a78882e789
  Information supplémentaire n° 3:  0a9e
  Information supplémentaire n° 4:  0a9e372d3b4ad19135b953a78882e789
如果我能做些什么来获得更多信息,请告诉我:)

1 个答案:

答案 0 :(得分:0)

好吧,我终于找到了解决方案: EndEdit实际上需要一个位置参数oldval 所以,替换

def EndEdit(self, row, col, grid):
def EndEdit(self, row, col, grid, oldval):
做的伎俩。我认为,这个论点也可以改进代码。 旁边,应该覆盖ApplyEdit(self,row,col,grid),这是对表的实际更改的地方...