Python 为 ObjectListView 复选框创建事件
当选中/取消选中某个框时,如何创建事件?对于此示例,我只想它打印有关已检查对象的数据
注意:此代码是从 http://www.blog.pythonlibrary.org/2009/12/23/wxpython-using-objectlistview-instead-of-a-listctrl/ 作为学习练习
import wx
from ObjectListView import ObjectListView, ColumnDefn
########################################################################
class Book(object):
"""
Model of the Book object
Contains the following attributes:
'ISBN', 'Author', 'Manufacturer', 'Title'
"""
#----------------------------------------------------------------------
def __init__(self, title, author, isbn, mfg):
self.isbn = isbn
self.author = author
self.mfg = mfg
self.title = title
########################################################################
class MainPanel(wx.Panel):
#----------------------------------------------------------------------
def __init__(self, parent):
wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
self.products = [Book("wxPython in Action", "Robin Dunn",
"1932394621", "Manning"),
Book("Hello World", "Warren and Carter Sande",
"1933988495", "Manning")
]
self.dataOlv = ObjectListView(self, wx.ID_ANY, style=wx.LC_REPORT|wx.SUNKEN_BORDER)
self.setBooks()
self.dataOlv.CreateCheckStateColumn()
# Allow the cell values to be edited when double-clicked
self.dataOlv.cellEditMode = ObjectListView.CELLEDIT_SINGLECLICK
# create an update button
updateBtn = wx.Button(self, wx.ID_ANY, "Update OLV")
updateBtn.Bind(wx.EVT_BUTTON, self.updateControl)
# Create some sizers
mainSizer = wx.BoxSizer(wx.VERTICAL)
mainSizer.Add(self.dataOlv, 1, wx.ALL|wx.EXPAND, 5)
mainSizer.Add(updateBtn, 0, wx.ALL|wx.CENTER, 5)
self.SetSizer(mainSizer)
#----------------------------------------------------------------------
def updateControl(self, event):
"""
"""
print "updating..."
product_dict = [Book("Core Python Programming", "Wesley Chun",
"0132269937", "Prentice Hall"),
Book("Python Programming for the Absolute Beginner",
"Michael Dawson", "1598631128", "Course Technology"),
Book("Learning Python", "Mark Lutz",
"0596513984", "O'Reilly")
]
data = self.products + product_dict
self.dataOlv.SetObjects(data)
#----------------------------------------------------------------------
def setBooks(self, data=None):
self.dataOlv.SetColumns([
ColumnDefn("Title", "left", 220, "title"),
ColumnDefn("Author", "left", 200, "author"),
ColumnDefn("ISBN", "right", 100, "isbn"),
ColumnDefn("Mfg", "left", 180, "mfg")
])
self.dataOlv.SetObjects(self.products)
########################################################################
class MainFrame(wx.Frame):
#----------------------------------------------------------------------
def __init__(self):
wx.Frame.__init__(self, parent=None, id=wx.ID_ANY,
title="ObjectListView Demo", size=(800,600))
panel = MainPanel(self)
########################################################################
class GenApp(wx.App):
#----------------------------------------------------------------------
def __init__(self, redirect=False, filename=None):
wx.App.__init__(self, redirect, filename)
#----------------------------------------------------------------------
def OnInit(self):
# create frame here
frame = MainFrame()
frame.Show()
return True
#----------------------------------------------------------------------
def main():
"""
Run the demo
"""
app = GenApp()
app.MainLoop()
if __name__ == "__main__":
main()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
ObjectListView
类似乎不包含该功能。在深入研究代码一段时间后,我决定扩展它。您可以从
ObjectListView
派生您自己的类并强制事件进入。您必须重写_HandleLeftDownOnImage
和SetCheckState
方法。或者,如果您愿意,也可以更改 ObjectListView 代码。我派生了一个新类:然后我使用该类而不是
ObjectListView
:绑定事件:
并编写处理程序:
我确信这不是最好的方法,但它是简单而有效的技巧:-D。
编辑:完整示例
The class
ObjectListView
does not seem to contain that functionality. After digging in the code for a while I have decided to extend it.You can derive your own class from
ObjectListView
and force the event in. You have to override_HandleLeftDownOnImage
andSetCheckState
methods. Or you can just change the ObjectListView code if you like. I have derived a new class:Then I used that class instead of
ObjectListView
:Bound the event:
And wrote the handler:
I am certain that this is not the best way how to do it, but it is simple and effective hack :-D.
Edit: Complete example
除了以下两个列表之外,ObjectListView 文档似乎没有关于此主题的任何数据:
http://objectlistview.sourceforge.net/python/recipes.html#data-based-checkboxes
http://objectlistview.sourceforge.net /python/recipes.html#how-do-i-use-checkboxes-in-my-objectlistview
第一个可能会通过 checkStateGetter 参数帮助您。我怀疑 ObjectListView 中包含 CheckListCtrlMixin 。如果是这样,那么您可以子类化您的 ObjectListView 类并重写 OnCheckItem 方法,如 CheckListCtrlMixin 的 wxPython 演示所示。
我最后的想法是,当您选择行时,您可能必须执行临时事件绑定。我的意思是,在行的选择事件中,尝试获取事件对象(希望是 ListItem 实例)并将该对象绑定到 EVT_CHECKBOX。
如果这些都不起作用,那么请前往官方 wxPython 邮件列表并在那里询问。这就是大多数 wxPython 用户所在的地方。
The ObjectListView documentation doesn't seem to have any data on this subject besides the following two listings:
http://objectlistview.sourceforge.net/python/recipes.html#data-based-checkboxes
http://objectlistview.sourceforge.net/python/recipes.html#how-do-i-use-checkboxes-in-my-objectlistview
The first one might help you via the checkStateGetter parameter. I suspect that ObjectListView has the CheckListCtrlMixin included in it. If so, then you could subclass your ObjectListView class and override the OnCheckItem method, as shown in the wxPython demo for the CheckListCtrlMixin.
The last thought I had is that you might have to do an adhoc event binding when you select the row. What I mean is, in the selection event for the row, try to get the event object (hopefully a ListItem instance) and bind that object to EVT_CHECKBOX.
If none of those work, then head on over to the official wxPython mailing list and ask there. That's where the majority of wxPython users are.