我有一个主应用程序(f.py
)的单独文件和面板(p.py
)的单独文件。我正在Menubar
内设置Frame
到Panel
。这是我的工作代码:
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
在输出窗口上没有达到完整大小。这是输出图像:
现在,如果我在createMenu
内拨打Panel
Frame
功能(通过从subPanel.createMenuBar()
取消注释f.py
行并评论self.createMenuBar()
行从p.py
)它根据需要提供输出。以下是Panel
涵盖完整Frame
的输出图像:
我无法理解在Menubar
内设置Panel
会扰乱其大小的原因。任何帮助表示赞赏。
答案 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已被弃用。