【问题标题】:wxpython setting frame menubar from panelwxpython从面板设置框架菜单栏
【发布时间】:2014-05-01 08:56:53
【问题描述】:

我有一个单独的主应用文件 (f.py) 和一个单独的面板文件 (p.py)。我从Panel 中将Menubar 设置为Frame。这是我的工作代码:

f.py

import wx
import p

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Checking Menubar from external Panel")

        mainPanel = wx.Panel(self, -1)
        mainPanel.SetBackgroundColour(wx.Color(0, 255, 0))
        sizer = wx.BoxSizer(wx.VERTICAL)
        mainPanel.SetSizer(sizer)

        subPanel = p.MyPanel(parent=mainPanel)
        sizer.Add(subPanel, 1, wx.EXPAND)

#         subPanel.createMenuBar()

        self.Show()


if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = MyFrame()
    app.MainLoop()

p.py

import wx

class MyPanel(wx.Panel):
    def __init__(self, parent=None):
        wx.Panel.__init__(self, parent=parent, id=-1)
        self.SetBackgroundColour(wx.Color(255, 0, 0))

        self.createMenuBar()

    def createMenuBar(self):
        self.menuBar = wx.MenuBar()

        self.mnuFile = wx.Menu()
        self.mnuFile.Append(id=1, text="&New")
        self.mnuFile.Append(id=1, text="&Open")
        self.mnuFile.Append(id=1, text="E&xit")

        self.menuBar.Append(menu=self.mnuFile, title="&File")
        self.GetTopLevelParent().SetMenuBar(self.menuBar)

以上代码将Menubar 添加到Frame。但是Panel 在输出窗口上没有得到全尺寸。这是输出图像:

现在,如果我从Frame 中调用Panel 的createMenu 函数(通过取消注释f.py 中的subPanel.createMenuBar() 行并评论self.createMenuBar() 中的self.createMenuBar() 行)它会根据需要提供输出。这是Panel 覆盖完整Frame 的输出图像:

我无法理解为什么在Panel 中设置Menubar 会扰乱它的大小。任何帮助表示赞赏。

【问题讨论】:

    标签: wxpython panel frame menubar


    【解决方案1】:

    您只需要在您的 sizer 对象上调用 Layout():

    import wx
    import p
    
    class MyFrame(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None, -1, "Checking Menubar from external Panel")
    
            mainPanel = wx.Panel(self, -1)
            mainPanel.SetBackgroundColour(wx.Color(0, 255, 0))
            sizer = wx.BoxSizer(wx.VERTICAL)
            mainPanel.SetSizer(sizer)
    
            subPanel = p.MyPanel(parent=mainPanel)
            sizer.Add(subPanel, 1, wx.EXPAND)
    
    #         subPanel.createMenuBar()
    
            self.Show()
            sizer.Layout()
    
    
    if __name__ == '__main__':
        app = wx.App(False)
        frame = MyFrame()
        app.MainLoop()
    

    就个人而言,我真的没有理由在另一个面板之上添加一个面板。这只会增加不必要的复杂性。这是一个较短的版本:

    import wx
    import p
    
    class MyFrame(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None, -1, "Checking Menubar from external Panel")
    
            sizer = wx.BoxSizer(wx.VERTICAL)
    
            mainPanel = p.MyPanel(parent=self)
            sizer.Add(mainPanel, 1, wx.EXPAND)
            self.SetSizer(sizer)
    
            self.Show()
    
    if __name__ == '__main__':
        app = wx.App(False)
        frame = MyFrame()
        app.MainLoop()
    

    您会注意到,我什至不需要在第二个版本上调用 Layout(),因为它们只有一个面板,它会自动占用所有空间。另请注意,我将您的调用从 wx.PySimpleApp 更改为 wx.App(False)。 PySimpleApp 已弃用。

    【讨论】:

    • 实际上我正在创建多个subPanels,它们全屏显示并带有显示/隐藏动画。我有一个mainPanel,这样我就可以处理所有subPanel 的容器。感谢您为 wx.PySimpleApp 弃用提供信息。
    猜你喜欢
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多