WxPython在多个面板之间切换

2024-10-04 01:35:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我是wxpython新手,正在开发我的第一个应用程序。我知道这个话题有很多,但我没有看到任何对我的问题有帮助的东西。我想要两个以上的面板和这样的开关

def switch(self, newactpanel) 
    self.actpanel.Hide()
    self.actpanel=newactpanel
    self.actpanel.Show()

到目前为止,这还不起作用。应用程序启动,按钮出现,但两个面板视图同时出现,或者只有一个出现,我无法切换。如何构建一个在更多面板之间切换的def?在

非常感谢你的回答。在

这是我的代码:

^{pr2}$

Tags: 代码self视图应用程序面板defshowwxpython
3条回答

问题是在电话上:

    wx.EVT_MENU(self, ID_ADDKEYWORDS, self.SwitchPanel(self.addkeywpnl))
    wx.EVT_MENU(self, ID_WRITEINTERP, self.SwitchPanel(self.wrtpnl))

您已经在调用SwitchPanel函数。调用的结果是None(SwitchPanel不返回任何内容),因此这与您所做的相同:

^{pr2}$

最容易理解的解决方案可能是:

    wx.EVT_MENU(self, ID_ADDKEYWORDS, self.SwitchPanel1)
    wx.EVT_MENU(self, ID_WRITEINTERP, self.SwitchPanel2)
    # [...]

def SwitchPanel1(self, evt):
    evt.Skip()
    self.SwitchPanel(self.addkeywpnl)

def SwitchPanel2(self, evt):
    evt.Skip()
    self.SwitchPanel(self.wrtpnl)

实际上,我不久前就这个话题写了一篇tutorial。代码如下:

import wx
import wx.grid as gridlib

########################################################################
class PanelOne(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent=parent)
        txt = wx.TextCtrl(self)

########################################################################
class PanelTwo(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent=parent)

        grid = gridlib.Grid(self)
        grid.CreateGrid(25,12)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(grid, 0, wx.EXPAND)
        self.SetSizer(sizer)

########################################################################
class MyForm(wx.Frame):

    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, 
                          "Panel Switcher Tutorial")

        self.panel_one = PanelOne(self)
        self.panel_two = PanelTwo(self)
        self.panel_two.Hide()

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.panel_one, 1, wx.EXPAND)
        self.sizer.Add(self.panel_two, 1, wx.EXPAND)
        self.SetSizer(self.sizer)


        menubar = wx.MenuBar()
        fileMenu = wx.Menu()
        switch_panels_menu_item = fileMenu.Append(wx.ID_ANY, 
                                                  "Switch Panels", 
                                                  "Some text")
        self.Bind(wx.EVT_MENU, self.onSwitchPanels, 
                  switch_panels_menu_item)
        menubar.Append(fileMenu, '&File')
        self.SetMenuBar(menubar)

    #----------------------------------------------------------------------
    def onSwitchPanels(self, event):
        """"""
        if self.panel_one.IsShown():
            self.SetTitle("Panel Two Showing")
            self.panel_one.Hide()
            self.panel_two.Show()
        else:
            self.SetTitle("Panel One Showing")
            self.panel_one.Show()
            self.panel_two.Hide()
        self.Layout()


# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

您可能还想看看使用wxPython的“Book”控件之一,例如wx.Notebook。在

在为菜单项创建事件时,不需要同时传递两个面板对象。在

wx.EVT_MENU(self, ID_ADDKEYWORDS, self.SwitchPanel)
wx.EVT_MENU(self, ID_WRITEINTERP, self.SwitchPanel)

使用获取菜单项ID事件.GetId()方法来标识要隐藏和显示的面板。在

^{pr2}$

相关问题 更多 >