2012-09-24 7 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() 

내가 원하는 ListBook의 각 페이지에 ListCtrl을 삽입하려면 어떻게해야합니까?

나는 TestLB.py에 OnPageChanged() 기능을 수정하는 것을 시도했다 :

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 기능이 어디에 있는지 모르지만 책 자체가 부모 인 페이지를 만들어야합니다.

관련 문제