2013-03-22 50 views
0

我試圖在我的面板中創建一個樹ctrl組件,但是當我運行代碼時,我沒有看到任何操作。Treectrl wxpython

代碼

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() 

回答

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() 
+0

感謝很多Driscoll..One更question.How我知道需要傳遞一個Panel..For實例的初始化參數列表: - 迪爾(wx.Panel)給我所有的方法,但我怎麼知道特定方法的參數列表。 – user1050619 2013-03-23 00:12:12

+0

欲瞭解更多信息,請試試'help(wx.Panel)' – rakslice 2013-10-25 01:48:12