wxpython从面板设置框架菜单栏

时间:2014-03-24 05:51:24

标签: wxpython panel frame menubar

我有一个主应用程序(f.py)的单独文件和面板(p.py)的单独文件。我正在Menubar内设置FramePanel。这是我的工作代码:

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在输出窗口上没有达到完整大小。这是输出图像:

<code>Panel</code> not getting full size

现在,如果我在createMenu内拨打Panel Frame功能(通过从subPanel.createMenuBar()取消注释f.py行并评论self.createMenuBar()行从p.py)它根据需要提供输出。以下是Panel涵盖完整Frame的输出图像:

<code>Panel</code> covers full <code>Frame</code>

我无法理解在Menubar内设置Panel会扰乱其大小的原因。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

您只需要在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(错误)。 PySimpleApp已被弃用。