Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
wxPython dataviewcustomrenderer左键单击事件获胜';t火_Python_Wxwidgets_Wxpython - Fatal编程技术网

wxPython dataviewcustomrenderer左键单击事件获胜';t火

wxPython dataviewcustomrenderer左键单击事件获胜';t火,python,wxwidgets,wxpython,Python,Wxwidgets,Wxpython,我有一个DataViewListCtrl,其中我希望有一列按钮。为此,我使用以下自定义渲染器: class DataViewButtonRenderer( dv.DataViewCustomRenderer ): def __init__(self, log, *args, **kw): dv.DataViewCustomRenderer.__init__(self, *args, **kw) self.log = log self.down = False s

我有一个DataViewListCtrl,其中我希望有一列按钮。为此,我使用以下自定义渲染器:

class DataViewButtonRenderer( dv.DataViewCustomRenderer ):

def __init__(self, log, *args, **kw):
    dv.DataViewCustomRenderer.__init__(self, *args, **kw)
    self.log = log
    self.down = False
    self.value = None

def SetValue(self, value):
    self.value = value
    return True

def GetValue(self):
    return self.value

def GetSize(self):
    value = self.value if self.value else ""
    size = self.GetTextExtent(value * 2)
    return size

def Render(self, rect, dc, state):
    dc.SetBrush( wx.LIGHT_GREY_BRUSH )
    dc.SetPen( wx.TRANSPARENT_PEN )

    rect.Deflate(2)

    dc.DrawRoundedRectangle( rect, 4 )
    value = self.value if self.value else ""
    self.RenderText(value, 15, rect, dc, state)

    if self.down and not self.click_handled:
        self.click_handled = True
        self.ActivateCell()

    return True

def GetValueFromEditorCtrl(self, editor):
    self.log.write('GetValueFromEditorCtrl: %s' % editor)
    value = editor.GetValue()
    return True, value

def LeftClick(self, pos, cellRect, model, item, col):
    self.log.write('LeftClick')
    print "Left Click"
    return False

def ActivateCell(self, cell, model, item, col, event=wx.MouseEvent):
    self.log.write('ActivateCell')
    print "Button clicked"
    return False

但是如何让左键单击事件真正启动呢?我曾尝试在init函数中使用self.Bind,但这给了我一个错误,即“DataViewButtonRenderer”对象没有属性“Bind”,即DataViewCustomRenderer没有绑定方法。如何绑定事件?

渲染器只负责渲染,即绘制单元格内容。要更改它,您有两种可能:使单元格可激活,然后您可以对双击单元格或从键盘生成的
wxEVT\u DATAVIEW\u ITEM\u ACTIVATED
事件作出反应;或者使其可编辑,然后您可以通过覆盖渲染器中的
CreateEditorCtrl()
方法为其使用自定义编辑器。

我明白了。它需要一次点击,所以可能性1不存在。如果我将其设置为可编辑,CreateEditorControl是否会在用户选择该单元格后创建控件(在我的情况下,是一个按钮)?对不起,“双击”是一个错误,可激活单元格只需单击即可激活,请参见例如切换(复选框)单元格的行为。编辑控件确实是在单元格被选中之后创建的,但它还有什么可能工作呢?因此我可以使用CreateEditorControl来执行事件,而不是让它绘制控件?我从未尝试过,这将形成一个非常令人惊讶的UI。如果你能让你的细胞活化,就这样做吧。