我在GUI中使用customtreectrl。 customtreectrl的项目有一个复选框。我想从customtreectrl获取那些被检查的项目。我还希望得到那些未经检查的项目,并在检查之前。 Customtreecontrol可以提供使用 GetSelection()或 GetSelections()方法选择的项目,但是没有可用于获取已检查项目的方法。我提出了以下解决方案: How do you get checkbox selections from a CustomTreeCtrl 但是有一个问题,即如果我已经检查了一些customtreectrl项,就永远不会达到 ItemChecked(self,event)方法中的条件。换句话说,是否检查了customtreectrl项 event.IsChecked()总是返回 False 。任何帮助将不胜感激。
答案 0 :(得分:2)
Andrea Gavana(CustomTreeCtrl的创建者)实际上写了一个小函数,你可以用它在wxPython邮件列表上做这件事:
我在您的问题中将您链接的示例与Andrea的代码结合起来,得出以下示例:
import wx
import wx.lib.agw.customtreectrl as CT
########################################################################
class MyCustomTree(CT.CustomTreeCtrl):
""""""
#----------------------------------------------------------------------
def __init__(self, parent, *args, **kw):
""""""
CT.CustomTreeCtrl.__init__(self, parent, *args, **kw)
def GetCheckedItems(self, itemParent=None, checkedItems=None):
if itemParent is None:
itemParent = self.GetRootItem()
if checkedItems is None:
checkedItems = []
child, cookie = self.GetFirstChild(itemParent)
while child:
if self.IsItemChecked(child):
checkedItems.append(child)
checkedItems = self.GetCheckedItems(child, checkedItems)
child, cookie = self.GetNextChild(itemParent, cookie)
return checkedItems
class MyFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "CustomTreeCtrl Demo")
panel = wx.Panel(self)
custom_tree = MyCustomTree(panel)
self.custom_tree = custom_tree
root = custom_tree.AddRoot("The Root Item")
for y in range(5):
last = custom_tree.AppendItem(root, "item %d" % y)
for z in range(5):
item = custom_tree.AppendItem(last, "item %d" % z, ct_type=1)
self.Bind(CT.EVT_TREE_ITEM_CHECKED, self.ItemChecked)
btn = wx.Button(panel, label="Find Checked Items")
btn.Bind(wx.EVT_BUTTON, self.getCheckedItems)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(custom_tree, 1, wx.EXPAND)
sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)
panel.SetSizer(sizer)
def ItemChecked(self, event):
print("Somebody checked something")
#----------------------------------------------------------------------
def getCheckedItems(self, event):
""""""
checked_items = self.custom_tree.GetCheckedItems()
for item in checked_items:
print item.GetText()
if __name__ == '__main__':
app = wx.App(False)
frame = MyFrame(None)
frame.Show()
app.MainLoop()
这对我有用。
答案 1 :(得分:-1)
我在event.IsChecked()上也遇到类似的问题,总是返回False。使用event.GetItem()。IsChecked()解决了问题。