尝试使用TreeCtrl小部件,在退出时出现运行时错误

时间:2018-08-24 07:29:13

标签: wxpython

我是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上进行过测试

1 个答案:

答案 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)