0

我是 wxPython 的新手。

我可以构建一个 ListCtrl(a Demo of 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 是 a list,每个元素都是 a string。但它没有按预期工作。ListCtrl 没有显示在 Panel(ListBook 的右侧)上,而是显示在整个 ListBook 上。那么我怎样才能让它按预期工作。

4

1 回答 1

0

如果您想动态添加页面内容,您可以这样做,但通常在构建AddPage()后立即调用会简单得多。wxListbook也就是说,实际上不需要处理任何事件,只需在创建书籍控件本身时创建并添加所有页面(它们只是任意窗口)。

另外,我不知道您的makePanel功能在哪里,但您需要创建以书本身为父的页面。

于 2012-09-24T14:48:58.637 回答