2012-09-24 67 views
0

我是wxPython的新手。如何把ListCtrl放入wxPython的ListBook中?

我可以建立的ListCtrl(wxPython中的演示)(TestVirtualList.py),

import wx 
import sys 

#---------------------------------------------------------------------- 

class TestVirtualList(wx.ListCtrl): 
    def __init__(self, parent, log): 
     wx.ListCtrl.__init__(
      self, parent, -1, 
      style=wx.LC_REPORT|wx.LC_VIRTUAL|wx.LC_HRULES|wx.LC_VRULES 
      ) 

     self.log = log 

     self.InsertColumn(0, "First") 
     self.InsertColumn(1, "Second") 
     self.InsertColumn(2, "Third") 
     self.SetColumnWidth(0, 175) 
     self.SetColumnWidth(1, 175) 
     self.SetColumnWidth(2, 175) 

     self.SetItemCount(100) 

     self.attr1 = wx.ListItemAttr() 
     self.attr1.SetBackgroundColour("yellow") 

     self.attr2 = wx.ListItemAttr() 
     self.attr2.SetBackgroundColour("light blue") 

     self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected) 
     self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated) 
     self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected) 


    def OnItemSelected(self, event): 
     self.currentItem = event.m_itemIndex 
     self.log.write('OnItemSelected: "%s", "%s", "%s", "%s"\n' % 
          (self.currentItem, 
          self.GetItemText(self.currentItem), 
          self.getColumnText(self.currentItem, 1), 
          self.getColumnText(self.currentItem, 2))) 

    def OnItemActivated(self, event): 
     self.currentItem = event.m_itemIndex 
     self.log.write("OnItemActivated: %s\nTopItem: %s\n" % 
          (self.GetItemText(self.currentItem), self.GetTopItem())) 

    def getColumnText(self, index, col): 
     item = self.GetItem(index, col) 
     return item.GetText() 

    def OnItemDeselected(self, evt): 
     self.log.write("OnItemDeselected: %s" % evt.m_itemIndex) 

    def OnGetItemText(self, item, col): 
     return "Item %d, column %d" % (item, col) 




class TestVirtualListPanel(wx.Panel): 
    def __init__(self, parent, log): 
     wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS) 

     self.log = log 
     sizer = wx.BoxSizer(wx.VERTICAL) 

     if wx.Platform == "__WXMAC__" and \ 
       hasattr(wx.GetApp().GetTopWindow(), "LoadDemo"): 
      self.useNative = wx.CheckBox(self, -1, "Use native listctrl") 
      self.useNative.SetValue( 
       not wx.SystemOptions.GetOptionInt("mac.listctrl.always_use_generic")) 
      self.Bind(wx.EVT_CHECKBOX, self.OnUseNative, self.useNative) 
      sizer.Add(self.useNative, 0, wx.ALL | wx.ALIGN_RIGHT, 4) 

     self.list = TestVirtualList(self, self.log) 
     sizer.Add(self.list, 1, wx.EXPAND) 

     self.SetSizer(sizer) 
     self.SetAutoLayout(True) 

    def OnUseNative(self, event): 
     wx.SystemOptions.SetOptionInt("mac.listctrl.always_use_generic", not event.IsChecked()) 
     wx.GetApp().GetTopWindow().LoadDemo("ListCtrl_virtual") 

#---------------------------------------------------------------------- 

if __name__ == "__main__": 
    app = wx.PySimpleApp(0) 
    win = wx.Frame(parent = None, title = 'Simple Editor', size = (600, 400)) 
    log = sys.stdout 
    bkg = TestVirtualListPanel(win, log) 
    app.SetTopWindow(win) 
    win.Show() 
    app.MainLoop() 
#---------------------------------------------------------------------- 

,我可以建立一個ListBook(TestLB.py),

import wx 
import sys 


colourList = [ "Aquamarine", "Black", "Blue", "Blue Violet", "Brown", "Cadet Blue", 
       "Coral", "Cornflower Blue", "Cyan", "Dark Grey", "Dark Green", 
       "Dark Olive Green", 
       ] 

#---------------------------------------------------------------------------- 

class TestLB(wx.Listbook): 
    def __init__(self, parent, id, log): 
     wx.Listbook.__init__(self, parent, id, style= 
          wx.BK_DEFAULT 
          #wx.BK_TOP 
          #wx.BK_BOTTOM 
          #wx.BK_LEFT 
          #wx.BK_RIGHT 
          ) 
     self.log = log 

     # make an image list using the LBXX images 
     il = wx.ImageList(32, 32) 
     tsize = (32, 32) 
     for x in range(12): 
      bmp = wx.ArtProvider.GetBitmap(wx.ART_NEW, wx.ART_TOOLBAR, tsize) 
      il.Add(bmp) 
     self.AssignImageList(il) 

     # Now make a bunch of panels for the list book 
     first = True 
     imID = 0 
     for colour in colourList: 
      win = self.makeColorPanel(colour) 
      self.AddPage(win, colour, imageId=imID) 
      imID += 1 
      if imID == il.GetImageCount(): imID = 0 
      if first: 
       st = wx.StaticText(win, -1, 
          "I want the LISTCRL to show here,\n" 
          "This is the LISTCTRL %d, how can I do this???" % (imID), 
          wx.Point(10, 10)) 
       first = True 

     self.Bind(wx.EVT_LISTBOOK_PAGE_CHANGED, self.OnPageChanged) 
     self.Bind(wx.EVT_LISTBOOK_PAGE_CHANGING, self.OnPageChanging) 


    def makeColorPanel(self, color): 
     p = wx.Panel(self, -1) 
     return p 


    def OnPageChanged(self, event): 
     old = event.GetOldSelection() 
     new = event.GetSelection() 
     sel = self.GetSelection() 
     self.log.write('OnPageChanged, old:%d, new:%d, sel:%d\n' % (old, new, sel)) 
     event.Skip() 

    def OnPageChanging(self, event): 
     old = event.GetOldSelection() 
     new = event.GetSelection() 
     sel = self.GetSelection() 
     self.log.write('OnPageChanging, old:%d, new:%d, sel:%d\n' % (old, new, sel)) 
     event.Skip() 

#---------------------------------------------------------------------------- 

if __name__ == "__main__": 
    app = wx.PySimpleApp(0) 
    win = wx.Frame(parent = None, title = 'Simple Editor', size = (600, 400)) 
    log = sys.stdout 
    booklist = TestLB(win, -1, log) 
    app.SetTopWindow(win) 
    win.Show() 
    app.MainLoop() 

現在我想要將ListCtrls放入ListBook的每個頁面中,我該怎麼做?

我試圖修改OnPageChanged()功能TestLB.py:

def OnPageChanged(self, event): 
    old = event.GetOldSelection() 
    new = event.GetSelection() 
    sel = self.GetSelection() 
    self.log.write('OnPageChanged, old:%d, new:%d, sel:%d\n' % (old, new, sel)) 

    win = self.makePanel() 
    sizer = wx.BoxSizer(wx.VERTICAL) 

    object_list = ObjectList(self, self.log) 
    sizer.Add(object_list, 1, wx.EXPAND) 


    win.SetSizer(sizer) 
    self.SetAutoLayout(True) 
    self.AddPage(win, bucketList[new], imageId=new) 

    event.Skip() 

bucketList是list和每個元素是一個string。但它沒有按預期工作。 ListCtrl沒有顯示在Panel(ListBook的右邊部分)上,而是顯示在整個ListBook上。所以我怎麼才能讓它按預期工作。

回答

0

如果您想要動態添加頁面內容,您可以這樣做,但通常在wxListbook構建後立即調用AddPage()要簡單得多。即實際上不需要處理任何事件,只需在創建書本控件本身時創建並添加所有頁面(這些頁面只是任意窗口)。

此外,我不知道你的makePanel函數在哪裏,但是你需要創建書本身作爲父類的頁面。