为什么 wx.Panel 在这个简单的代码中搞砸了 Sizer?
Why wx.Panel messed up the Sizer in this simple code?
我是 Python 的新手,这周我正在尝试使用 wxPython 模块来创建 GUI。我想我了解如何使用 sizer,但这段代码发生的事情让我很感兴趣。谁能帮我理解为什么?
此代码应创建一个用于工具栏目的的子面板及其后的一些内容:
import wx
class Main_window (wx.Frame):
def __init__(self):
super(Main_window, self).__init__(parent = None, title = 'Some App')
main_panel = wx.Panel(self)
main_panel_sizer = wx.BoxSizer(wx.VERTICAL)
# Calling panels
toolbar = ToolBar(self)
main_panel_sizer.Add(toolbar, 1, wx.EXPAND)
button1 = wx.Button(main_panel, label='Button 1')
main_panel_sizer.Add(button1, 0, wx.ALL|wx.ALIGN_LEFT)
text = wx.StaticText(main_panel, label = 'Text 1')
main_panel_sizer.Add(text, wx.ALL|wx.ALIGN_LEFT)
# Final lines of constructor
main_panel.SetSizer(main_panel_sizer)
self.Show()
class ToolBar (wx.Panel):
def __init__(self, parent):
super().__init__(parent)
self.SetBackgroundColour('blue')
toolbar_sizer = wx.BoxSizer(wx.HORIZONTAL)
button2 = wx.Button(self, label = 'Button 2')
toolbar_sizer.Add(button2, 0, wx.ALIGN_LEFT)
self.SetSizer(toolbar_sizer)
if __name__ == '__main__':
app = wx.App()
frame = Main_window()
app.MainLoop()
但是输出一团糟。子面板、文本和按钮堆叠在顶部。但是如果我评论工具栏调用:
import wx
class Main_window (wx.Frame):
def __init__(self):
super(Main_window, self).__init__(parent = None, title = 'Some App')
main_panel = wx.Panel(self)
main_panel_sizer = wx.BoxSizer(wx.VERTICAL)
# Calling panels
# toolbar = ToolBar(self)
# main_panel_sizer.Add(toolbar, 1, wx.EXPAND)
button1 = wx.Button(main_panel, label='Button 1')
main_panel_sizer.Add(button1, 0, wx.ALL|wx.ALIGN_LEFT)
text = wx.StaticText(main_panel, label = 'Text 1')
main_panel_sizer.Add(text, wx.ALL|wx.ALIGN_LEFT)
# Final lines of constructor
main_panel.SetSizer(main_panel_sizer)
self.Show()
class ToolBar (wx.Panel):
def __init__(self, parent):
super().__init__(parent)
self.SetBackgroundColour('blue')
toolbar_sizer = wx.BoxSizer(wx.HORIZONTAL)
button2 = wx.Button(self, label = 'Button 2')
toolbar_sizer.Add(button2, 0, wx.ALIGN_LEFT)
self.SetSizer(toolbar_sizer)
if __name__ == '__main__':
app = wx.App()
frame = Main_window()
app.MainLoop()
sizer 再次正常工作。有人可以解释一下吗?似乎是巫术。
提前致谢。
粗略地说,您没有将 sizer 应用于 Main_window,ToolBar 是一个独立的面板。
下面我为 self 分配了一个 sizer,并将 main_panel 和工具栏放入其中,它们都有自己的 sizer。
希望这能说明问题。 (提示:这不是魔术 - 事实上它是罗宾·邓恩先生提供的):)
import wx
class Main_window (wx.Frame):
def __init__(self):
super(Main_window, self).__init__(parent = None, title = 'Some App')
main_panel = wx.Panel(self)
main_panel_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer = wx.BoxSizer(wx.VERTICAL)
# Calling panels
toolbar = ToolBar(self)
button1 = wx.Button(main_panel, label='Button 1')
main_panel_sizer.Add(button1, 0, wx.ALL|wx.ALIGN_LEFT)
text = wx.StaticText(main_panel, label = 'Text 1')
main_panel_sizer.Add(text, wx.ALL|wx.ALIGN_LEFT)
main_panel.SetSizer(main_panel_sizer)
main_sizer.Add(toolbar, 1, wx.EXPAND)
main_sizer.Add(main_panel)
# Final lines of constructor
self.SetSizer(main_sizer)
self.Show()
class ToolBar (wx.Panel):
def __init__(self, parent):
super().__init__(parent)
self.SetBackgroundColour('blue')
toolbar_sizer = wx.BoxSizer(wx.HORIZONTAL)
button2 = wx.Button(self, label = 'Button 2')
toolbar_sizer.Add(button2, 0, wx.ALIGN_LEFT)
self.SetSizer(toolbar_sizer)
if __name__ == '__main__':
app = wx.App()
frame = Main_window()
app.MainLoop()
我是 Python 的新手,这周我正在尝试使用 wxPython 模块来创建 GUI。我想我了解如何使用 sizer,但这段代码发生的事情让我很感兴趣。谁能帮我理解为什么?
此代码应创建一个用于工具栏目的的子面板及其后的一些内容:
import wx
class Main_window (wx.Frame):
def __init__(self):
super(Main_window, self).__init__(parent = None, title = 'Some App')
main_panel = wx.Panel(self)
main_panel_sizer = wx.BoxSizer(wx.VERTICAL)
# Calling panels
toolbar = ToolBar(self)
main_panel_sizer.Add(toolbar, 1, wx.EXPAND)
button1 = wx.Button(main_panel, label='Button 1')
main_panel_sizer.Add(button1, 0, wx.ALL|wx.ALIGN_LEFT)
text = wx.StaticText(main_panel, label = 'Text 1')
main_panel_sizer.Add(text, wx.ALL|wx.ALIGN_LEFT)
# Final lines of constructor
main_panel.SetSizer(main_panel_sizer)
self.Show()
class ToolBar (wx.Panel):
def __init__(self, parent):
super().__init__(parent)
self.SetBackgroundColour('blue')
toolbar_sizer = wx.BoxSizer(wx.HORIZONTAL)
button2 = wx.Button(self, label = 'Button 2')
toolbar_sizer.Add(button2, 0, wx.ALIGN_LEFT)
self.SetSizer(toolbar_sizer)
if __name__ == '__main__':
app = wx.App()
frame = Main_window()
app.MainLoop()
但是输出一团糟。子面板、文本和按钮堆叠在顶部。但是如果我评论工具栏调用:
import wx
class Main_window (wx.Frame):
def __init__(self):
super(Main_window, self).__init__(parent = None, title = 'Some App')
main_panel = wx.Panel(self)
main_panel_sizer = wx.BoxSizer(wx.VERTICAL)
# Calling panels
# toolbar = ToolBar(self)
# main_panel_sizer.Add(toolbar, 1, wx.EXPAND)
button1 = wx.Button(main_panel, label='Button 1')
main_panel_sizer.Add(button1, 0, wx.ALL|wx.ALIGN_LEFT)
text = wx.StaticText(main_panel, label = 'Text 1')
main_panel_sizer.Add(text, wx.ALL|wx.ALIGN_LEFT)
# Final lines of constructor
main_panel.SetSizer(main_panel_sizer)
self.Show()
class ToolBar (wx.Panel):
def __init__(self, parent):
super().__init__(parent)
self.SetBackgroundColour('blue')
toolbar_sizer = wx.BoxSizer(wx.HORIZONTAL)
button2 = wx.Button(self, label = 'Button 2')
toolbar_sizer.Add(button2, 0, wx.ALIGN_LEFT)
self.SetSizer(toolbar_sizer)
if __name__ == '__main__':
app = wx.App()
frame = Main_window()
app.MainLoop()
sizer 再次正常工作。有人可以解释一下吗?似乎是巫术。
提前致谢。
粗略地说,您没有将 sizer 应用于 Main_window,ToolBar 是一个独立的面板。
下面我为 self 分配了一个 sizer,并将 main_panel 和工具栏放入其中,它们都有自己的 sizer。
希望这能说明问题。 (提示:这不是魔术 - 事实上它是罗宾·邓恩先生提供的):)
import wx
class Main_window (wx.Frame):
def __init__(self):
super(Main_window, self).__init__(parent = None, title = 'Some App')
main_panel = wx.Panel(self)
main_panel_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer = wx.BoxSizer(wx.VERTICAL)
# Calling panels
toolbar = ToolBar(self)
button1 = wx.Button(main_panel, label='Button 1')
main_panel_sizer.Add(button1, 0, wx.ALL|wx.ALIGN_LEFT)
text = wx.StaticText(main_panel, label = 'Text 1')
main_panel_sizer.Add(text, wx.ALL|wx.ALIGN_LEFT)
main_panel.SetSizer(main_panel_sizer)
main_sizer.Add(toolbar, 1, wx.EXPAND)
main_sizer.Add(main_panel)
# Final lines of constructor
self.SetSizer(main_sizer)
self.Show()
class ToolBar (wx.Panel):
def __init__(self, parent):
super().__init__(parent)
self.SetBackgroundColour('blue')
toolbar_sizer = wx.BoxSizer(wx.HORIZONTAL)
button2 = wx.Button(self, label = 'Button 2')
toolbar_sizer.Add(button2, 0, wx.ALIGN_LEFT)
self.SetSizer(toolbar_sizer)
if __name__ == '__main__':
app = wx.App()
frame = Main_window()
app.MainLoop()