我是wxPython的新手,并且正在玩TreeCtrl小部件。我做了这个TreeCtrl测试,它具有以下行为: -左键选择项目,右键单击取消选择 -项目的子项(如果有)也会自动选择/取消选择 它按预期工作,但退出时出现运行时错误:
回溯(最近通话最近):
传播中的文件“ U:\ python \ wxpython \ treectrl.py”,第49行,
状态= self.tree.IsSelected(项目)
RuntimeError:MyTree类型的包装C / C ++对象已被删除
这是我的代码:
import wx
class MyTree(wx.TreeCtrl):
def __init__(self, parent, id, position, size, style):
wx.TreeCtrl.__init__(self, parent, id, position, size, style)
root = self.AddRoot('Root')
i1 = self.AppendItem(root, 'Item 1')
i2 = self.AppendItem(root, 'Item 2')
i3 = self.AppendItem(root, 'Item 3')
self.AppendItem(i1, 'Tomato')
self.AppendItem(i1, 'Orange')
self.AppendItem(i1, '42')
i2_1 = self.AppendItem(i2, 'Sub Item 1')
i2_2 = self.AppendItem(i2, 'Sub Item 2')
self.AppendItem(i2_1, 'blah')
self.AppendItem(i2_1, 'meh')
self.AppendItem(i2_1, '...')
self.AppendItem(i2_1, 'wut')
self.AppendItem(i2_2, '1')
self.AppendItem(i2_2, '2')
self.AppendItem(i3, 'small')
self.AppendItem(i3, 'medium')
self.AppendItem(i3, 'big')
self.ExpandAll()
class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title,
wx.DefaultPosition, wx.Size(450, 350))
leftPanel = wx.Panel(self)
self.tree = MyTree(leftPanel, 1, wx.DefaultPosition, (400, 300),
wx.TR_HIDE_ROOT|wx.TR_HAS_BUTTONS|wx.TR_MULTIPLE)
self.tree.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnRightClick)
self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.Propagate)
self.Centre()
def OnRightClick(self, event):
item = event.GetItem()
self.tree.UnselectItem(item)
def Propagate(self, event):
item = event.GetItem()
state = self.tree.IsSelected(item)
count = self.tree.GetChildrenCount(item, False)
if count == 0:
return
else:
(child, cookie) = self.tree.GetFirstChild(item)
while child.IsOk():
self.tree.SelectItem(child, state)
(child, cookie) = self.tree.GetNextChild(item, cookie)
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'TreeCtrl')
frame.Show(True)
self.SetTopWindow(frame)
return True
if __name__ == '__main__':
app = MyApp(0)
app.MainLoop()
我注意到创建TreeCtrl时会自动生成EVT_TREE_SEL_CHANGED,因此删除TreeCtrl时也可能会生成事件,但我不知道该怎么做。尽管可能还有其他事情。
为什么会这样?
edit:使用4.0.3 msw(phoenix)wxWidgets 3.0.5运行Windows 7,但我尚未在linux上进行过测试
答案 0 :(得分:0)
我怀疑您的怀疑是正确的,尽管在Linux上使用'4.0.3 gtk2(phoenix)wxWidgets 3.0.5'时没有这样的问题
最好的选择是检查您是否确实有item
,即
def Propagate(self, event):
item = event.GetItem()
if not item:
return
state = self.tree.IsSelected(item)
count = self.tree.GetChildrenCount(item, False)
if count == 0:
return
else:
(child, cookie) = self.tree.GetFirstChild(item)
while child.IsOk():
self.tree.SelectItem(child, state)
(child, cookie) = self.tree.GetNextChild(item, cookie)