【问题标题】:Treectrl wxpythonTreectrl wxpython
【发布时间】:2013-03-22 18:34:19
【问题描述】:

我试图在我的面板中创建一个树形 ctrl 组件,但是当我运行代码时,我没有看到任何操作。

代码

import wx

class MyTreeCtrl(wx.TreeCtrl):
    def __init__(self, parent, id, pos, size, style):
        wx.TreeCtrl.__init__(self, parent, id, pos, size, style)



class Example(wx.Frame):

    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title=title, 
        size=(700, 700))
        tID = wx.NewId()
        self.tree = MyTreeCtrl(self,tId,wx.DefaultPosition,wx.DefaultSize,wx.TR_DEFAULT_SIZE)
        isz = (16,16)
        il = wx.ImageList(isz[0], isz[1])
        fldridx     = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER,      wx.ART_OTHER, isz))
        fldropenidx = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN,   wx.ART_OTHER, isz))
        fileidx     = il.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, isz))
        smileidx    = il.Add(images.Smiles.GetBitmap())

        self.tree.SetImageList(il)
        self.il = il

        # NOTE:  For some reason tree items have to have a data object in
        #        order to be sorted.  Since our compare just uses the labels
        #        we don't need any real data, so we'll just use None below for
        #        the item data.

        self.root = self.tree.AddRoot("The Root Item")
        self.tree.SetPyData(self.root, None)
        self.tree.SetItemImage(self.root, fldridx, wx.TreeItemIcon_Normal)
        self.tree.SetItemImage(self.root, fldropenidx, wx.TreeItemIcon_Expanded)


        for x in range(15):
            child = self.tree.AppendItem(self.root, "Item %d" % x)
            self.tree.SetPyData(child, None)
            self.tree.SetItemImage(child, fldridx, wx.TreeItemIcon_Normal)
            self.tree.SetItemImage(child, fldropenidx, wx.TreeItemIcon_Expanded)

            for y in range(5):
                last = self.tree.AppendItem(child, "item %d-%s" % (x, chr(ord("a")+y)))
                self.tree.SetPyData(last, None)
                self.tree.SetItemImage(last, fldridx, wx.TreeItemIcon_Normal)
                self.tree.SetItemImage(last, fldropenidx, wx.TreeItemIcon_Expanded)

                for z in range(5):
                    item = self.tree.AppendItem(last,  "item %d-%s-%d" % (x, chr(ord("a")+y), z))
                    self.tree.SetPyData(item, None)
                    self.tree.SetItemImage(item, fileidx, wx.TreeItemIcon_Normal)
                    self.tree.SetItemImage(item, smileidx, wx.TreeItemIcon_Selected)

        print self.tree
        self.InitUI()
        self.Centre()
        self.Show() 


    def InitUI(self):

        panel = wx.Panel(self)
        panel.SetBackgroundColour('#4f5049')

        vbox = wx.BoxSizer(wx.VERTICAL)

        #midPan = wx.Panel(panel)
        #midPan.SetBackgroundColour('#ededed')

        vbox.Add(self.tree, 1, wx.EXPAND | wx.ALL, 20)
        panel.SetSizer(vbox)


if __name__ == '__main__':
        app = wx.App()
        Example(None,title="Border")
        app.MainLoop()

【问题讨论】:

    标签: wxpython


    【解决方案1】:

    嗯,我明白为什么了。该代码以其当前形式无法运行。 “tId”是一个未定义的变量,wx.TR_DEFAULT_SIZE 不是一个真正的样式标志。您还引用了“图像”模块,但没有导入它。有一个可运行的例子会很好。

    你也不是真的在问问题。什么不工作?当我编辑代码以使其运行时,我得到了这样的结果:

    import wx
    
    class MyTreeCtrl(wx.TreeCtrl):
        def __init__(self, parent, id, pos, size, style):
            wx.TreeCtrl.__init__(self, parent, id, pos, size, style)
    
    
    
    class Example(wx.Frame):
    
        def __init__(self, parent, title):
            super(Example, self).__init__(parent, title=title, 
            size=(700, 700))
            tID = wx.NewId()
            self.tree = MyTreeCtrl(self,tID,wx.DefaultPosition,wx.DefaultSize,wx.TR_HAS_BUTTONS)
            isz = (16,16)
            il = wx.ImageList(isz[0], isz[1])
            fldridx     = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER,      wx.ART_OTHER, isz))
            fldropenidx = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN,   wx.ART_OTHER, isz))
            fileidx     = il.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, isz))
    
    
            self.tree.SetImageList(il)
            self.il = il
    
            # NOTE:  For some reason tree items have to have a data object in
            #        order to be sorted.  Since our compare just uses the labels
            #        we don't need any real data, so we'll just use None below for
            #        the item data.
    
            self.root = self.tree.AddRoot("The Root Item")
            self.tree.SetPyData(self.root, None)
            self.tree.SetItemImage(self.root, fldridx, wx.TreeItemIcon_Normal)
            self.tree.SetItemImage(self.root, fldropenidx, wx.TreeItemIcon_Expanded)
    
    
            for x in range(15):
                child = self.tree.AppendItem(self.root, "Item %d" % x)
                self.tree.SetPyData(child, None)
                self.tree.SetItemImage(child, fldridx, wx.TreeItemIcon_Normal)
                self.tree.SetItemImage(child, fldropenidx, wx.TreeItemIcon_Expanded)
    
                for y in range(5):
                    last = self.tree.AppendItem(child, "item %d-%s" % (x, chr(ord("a")+y)))
                    self.tree.SetPyData(last, None)
                    self.tree.SetItemImage(last, fldridx, wx.TreeItemIcon_Normal)
                    self.tree.SetItemImage(last, fldropenidx, wx.TreeItemIcon_Expanded)
    
                    for z in range(5):
                        item = self.tree.AppendItem(last,  "item %d-%s-%d" % (x, chr(ord("a")+y), z))
                        self.tree.SetPyData(item, None)
                        self.tree.SetItemImage(item, fileidx, wx.TreeItemIcon_Normal)
                        #self.tree.SetItemImage(item, smileidx, wx.TreeItemIcon_Selected)
    
            print self.tree
            self.InitUI()
            self.Centre()
            self.Show() 
    
    
        def InitUI(self):
    
            panel = wx.Panel(self)
            panel.SetBackgroundColour('#4f5049')
    
            vbox = wx.BoxSizer(wx.VERTICAL)
    
            #midPan = wx.Panel(panel)
            #midPan.SetBackgroundColour('#ededed')
    
            vbox.Add(self.tree, 1, wx.EXPAND | wx.ALL, 20)
            panel.SetSizer(vbox)
    
    
    if __name__ == '__main__':
            app = wx.App()
            Example(None,title="Border")
            app.MainLoop()
    

    这会将树控件创建为左上角的一个小框。下一个问题是您将面板堆叠在 treectrl 的顶部,因为您将两个小部件的框架作为其父级,并且您首先创建了 treectrl。我重新排列了您的代码,以使面板成为 treectrl 的父级。见下文:

    import wx
    
    class MyTreeCtrl(wx.TreeCtrl):
        def __init__(self, parent, id, pos, size, style):
            wx.TreeCtrl.__init__(self, parent, id, pos, size, style)
    
    
    
    class Example(wx.Frame):
    
        def __init__(self, parent, title):
            super(Example, self).__init__(parent, title=title, size=(700, 700))
    
            panel = wx.Panel(self)
            panel.SetBackgroundColour('#4f5049')
    
            vbox = wx.BoxSizer(wx.VERTICAL)
    
            tID = wx.NewId()
            self.tree = MyTreeCtrl(panel,tID,wx.DefaultPosition,wx.DefaultSize,wx.TR_HAS_BUTTONS)
            vbox.Add(self.tree, 1, wx.EXPAND | wx.ALL, 20)
            panel.SetSizer(vbox)
    
            isz = (16,16)
            il = wx.ImageList(isz[0], isz[1])
            fldridx     = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER,      wx.ART_OTHER, isz))
            fldropenidx = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN,   wx.ART_OTHER, isz))
            fileidx     = il.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, isz))
    
    
            self.tree.SetImageList(il)
            self.il = il
    
            # NOTE:  For some reason tree items have to have a data object in
            #        order to be sorted.  Since our compare just uses the labels
            #        we don't need any real data, so we'll just use None below for
            #        the item data.
    
            self.root = self.tree.AddRoot("The Root Item")
            self.tree.SetPyData(self.root, None)
            self.tree.SetItemImage(self.root, fldridx, wx.TreeItemIcon_Normal)
            self.tree.SetItemImage(self.root, fldropenidx, wx.TreeItemIcon_Expanded)
    
    
            for x in range(15):
                child = self.tree.AppendItem(self.root, "Item %d" % x)
                self.tree.SetPyData(child, None)
                self.tree.SetItemImage(child, fldridx, wx.TreeItemIcon_Normal)
                self.tree.SetItemImage(child, fldropenidx, wx.TreeItemIcon_Expanded)
    
                for y in range(5):
                    last = self.tree.AppendItem(child, "item %d-%s" % (x, chr(ord("a")+y)))
                    self.tree.SetPyData(last, None)
                    self.tree.SetItemImage(last, fldridx, wx.TreeItemIcon_Normal)
                    self.tree.SetItemImage(last, fldropenidx, wx.TreeItemIcon_Expanded)
    
                    for z in range(5):
                        item = self.tree.AppendItem(last,  "item %d-%s-%d" % (x, chr(ord("a")+y), z))
                        self.tree.SetPyData(item, None)
                        self.tree.SetItemImage(item, fileidx, wx.TreeItemIcon_Normal)
                        #self.tree.SetItemImage(item, smileidx, wx.TreeItemIcon_Selected)
    
            print self.tree
            self.Centre()
            self.Show() 
    
    if __name__ == '__main__':
            app = wx.App()
            Example(None,title="Border")
            app.MainLoop()
    

    【讨论】:

    • 非常感谢 Driscoll..还有一个问题。我怎么知道需要为面板初始化传递的参数列表..例如:- dir(wx.Panel) 给了我所有方法,但我如何知道特定方法的参数列表。
    • 有关信息请尝试help(wx.Panel)
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多