如何将 wx.simplebook 的页面选择绑定到外部按钮?

How do I bind the page selection of a wx.simplebook to external buttons?

我正在尝试将 simplebook 的 .ChangeSelection() 函数绑定到不在书中但在同一框架中的按钮。

当前形式的示例代码是一个简单的框架,左侧有页面按钮,右侧显示书籍本身。目前 LHS 按钮未绑定,RHS wx.simplebook 显示空白页“0”。

我想让按钮在按下时显示相应的页面,但我很难在网上找到合适的示例 simplebooks 来学习这种格式。

import wx
### SIMPLEBOOK TEST
class MainPage (wx.Frame):
    def __init__ (self,parent):
        wx.Frame.__init__ ( self, None, 1, title = "NOTEBOOK", pos= wx.DefaultPosition, size = wx.Size( 320,400 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL)
        mainSizer = wx.BoxSizer(wx.HORIZONTAL)
        buttonSizer = wx.BoxSizer(wx.VERTICAL)
        pagesSizer = wx.BoxSizer(wx.VERTICAL)
        mainSizer.Add(buttonSizer,1,wx.EXPAND,0)
        mainSizer.Add(pagesSizer,1,wx.EXPAND,0)
        page1Button = wx.Button(self,wx.ID_ANY,"Page 1",wx.DefaultPosition,wx.DefaultSize,0)
        page2Button = wx.Button(self,wx.ID_ANY,"Page 2",wx.DefaultPosition,wx.DefaultSize,0)
        buttonSizer.Add(page1Button,1,wx.ALL|wx.EXPAND,0)
        buttonSizer.Add(page2Button,1,wx.ALL|wx.EXPAND,0)
        book = BookTest(self)
        pagesSizer.Add(book,1,wx.EXPAND|wx.ALL,2)
        self.SetSizer(mainSizer)
        self.Layout()
        ###########################################################
        # My attempts to bind the page selection to the buttons.
        #page1Button.Bind(wx.EVT_BUTTON,BookTest.page1sel())
        #page2Button.Bind(wx.EVT_BUTTON,page2sel())
        ###########################################################

class BookTest (wx.Simplebook):
    def __init__(self, parent):
        wx.Simplebook.__init__(self, parent=parent)
        blankpage=Blankpage(self)
        page1=Page1(self)
        page2=Page2(self)
        self.AddPage(blankpage,"")
        self.AddPage(page1,"")
        self.AddPage(page2,"")

    #### Here are the attempts to change page, both in a nested def and standalone.
    def page1sel():
       self.ChangeSelection(1)

def page2sel():
    BookTest.ChangeSelection(2)

class Blankpage (wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self,parent=parent)
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.Show()

class Page1 (wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self,parent=parent)
        sizer = wx.BoxSizer(wx.VERTICAL)
        t=wx.StaticText(self,-1,"THIS IS PAGE 1")
        sizer.Add(t,1,wx.EXPAND,0)
        self.Show()

class Page2 (wx.Panel):
    def __init__(self,parent):
        wx.Panel.__init__(self, parent=parent)
        sizer = wx.BoxSizer(wx.VERTICAL)
        t=wx.StaticText(self,-1,"THIS IS PAGE 2")
        sizer.Add(t,1,wx.EXPAND,0)

if __name__ == '__main__':
    app = wx.App()
    frm = MainPage(None)
    frm.Centre()
    frm.Show()
    app.MainLoop()

谢谢,日落

你们真的很亲密。只遗漏了两个细节。

1- 您通过在 class MainPage 中创建的 class 的实例从 class BookTest 调用方法 page1sel。这意味着像这样绑定:

page1Button.Bind(wx.EVT_BUTTON,book.page1sel)

2- 方法 page1sel 需要从 Bind 接收 event。所以必须定义为:

def page1sel(self, event):

page2sel也是一样,(在我看来)应该是class BookTest的方法。

代码:

import wx
### SIMPLEBOOK TEST
class MainPage (wx.Frame):
    def __init__ (self,parent):
        wx.Frame.__init__ ( self, None, 1, title = "NOTEBOOK", pos= wx.DefaultPosition, size = wx.Size( 320,400 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL)
        mainSizer = wx.BoxSizer(wx.HORIZONTAL)
        buttonSizer = wx.BoxSizer(wx.VERTICAL)
        pagesSizer = wx.BoxSizer(wx.VERTICAL)
        mainSizer.Add(buttonSizer,1,wx.EXPAND,0)
        mainSizer.Add(pagesSizer,1,wx.EXPAND,0)
        page1Button = wx.Button(self,wx.ID_ANY,"Page 1",wx.DefaultPosition,wx.DefaultSize,0)
        page2Button = wx.Button(self,wx.ID_ANY,"Page 2",wx.DefaultPosition,wx.DefaultSize,0)
        buttonSizer.Add(page1Button,1,wx.ALL|wx.EXPAND,0)
        buttonSizer.Add(page2Button,1,wx.ALL|wx.EXPAND,0)
        book = BookTest(self)
        pagesSizer.Add(book,1,wx.EXPAND|wx.ALL,2)
        self.SetSizer(mainSizer)
        self.Layout()
        ###########################################################
        # My attempts to bind the page selection to the buttons.
        page1Button.Bind(wx.EVT_BUTTON,book.page1sel)
        page2Button.Bind(wx.EVT_BUTTON,book.page2sel)
        ###########################################################

class BookTest (wx.Simplebook):
    def __init__(self, parent):
        wx.Simplebook.__init__(self, parent=parent)
        blankpage=Blankpage(self)
        page1=Page1(self)
        page2=Page2(self)
        self.AddPage(blankpage,"")
        self.AddPage(page1,"")
        self.AddPage(page2,"")

    #### Here are the attempts to change page, both in a nested def and standalone.
    def page1sel(self, event):
       self.ChangeSelection(1)

    def page2sel(self, event):
        self.ChangeSelection(2)

class Blankpage (wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self,parent=parent)
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.Show()

class Page1 (wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self,parent=parent)
        sizer = wx.BoxSizer(wx.VERTICAL)
        t=wx.StaticText(self,-1,"THIS IS PAGE 1")
        sizer.Add(t,1,wx.EXPAND,0)
        self.Show()

class Page2 (wx.Panel):
    def __init__(self,parent):
        wx.Panel.__init__(self, parent=parent)
        sizer = wx.BoxSizer(wx.VERTICAL)
        t=wx.StaticText(self,-1,"THIS IS PAGE 2")
        sizer.Add(t,1,wx.EXPAND,0)

if __name__ == '__main__':
    app = wx.App()
    frm = MainPage(None)
    frm.Centre()
    frm.Show()
    app.MainLoop()