我正在学习wxpython并尝试让嵌套面板工作。这是为更复杂的屏幕做准备的练习,因此它可能看起来有点复杂,但这是有目的的;)。 我想做的是以下内容: 创建一个顶部框架 添加一个面板 添加一些文本和输入字段 使用垂直boxsizer进行面板布局 以下是我实施它的方法:
import wx
class MainWindow(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent)
#add position panel
posPnl = wx.Panel(self)
lbl1 = wx.StaticText(posPnl, label="Position")
lbl2 = wx.StaticText(posPnl, label="Size")
sizeCtrl = wx.TextCtrl(posPnl)
posPnlSzr = wx.BoxSizer(wx.HORIZONTAL)
posPnlSzr.Add(lbl1, 1, wx.GROW)
posPnlSzr.Add(sizeCtrl, 1, wx.GROW)
posPnlSzr.Add(lbl2, 1, wx.GROW)
#create a top leverl sizer to add to the frame itself
mainSzr = wx.BoxSizer(wx.VERTICAL)
mainSzr.Add(posPnlSzr)
self.SetSizerAndFit(mainSzr)
self.Show()
app = wx.App(False)
frame = MainWindow(None, "Trading Client")
app.MainLoop()
我得到的是一个小空白屏幕,上面写着“Pos”字样。我在这里做错了什么?
答案 0 :(得分:4)
这里的逻辑是创建一个Panel
来添加控件,然后创建一个BoxSizer
,你可以在其中声明你在Panel
中添加的每个控件如何调整大小,并最终设置Panel
申请BoxSizer
的内容是什么。
你有2个问题。
首先,您缺少posPnl
对象的上述语句的最后一部分。加上这个:
posPnl.SetSizer(posPnlSzr)
将控件添加到posPnlSzr
第二个问题是您要在posSnlSzr
中添加mainSzr
。这样做是错误的。逻辑是将控件添加到sizer,您可以将Panel
视为复合控件。因此,正确的代码是将posPnl
添加到mainSzr
:
mainSzr.Add(posPnl)
到目前为止,您正试图通过主窗口自动调整posPnl
的大小。如果要添加面板以便mainSzr
实际调整大小:
mainSzr.Add(posPnl, 1, wx.GROW)
这给出了最终的源代码:
#!/usr/bin/env python
import wx
class MainWindow(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent)
#add position panel
posPnl = wx.Panel(self)
lbl1 = wx.StaticText(posPnl, label="Position")
lbl2 = wx.StaticText(posPnl, label="Size")
sizeCtrl = wx.TextCtrl(posPnl)
posPnlSzr = wx.BoxSizer(wx.HORIZONTAL)
posPnlSzr.Add(lbl1, 1, wx.GROW)
posPnlSzr.Add(sizeCtrl, 1, wx.GROW)
posPnlSzr.Add(lbl2, 1, wx.GROW)
posPnl.SetSizer(posPnlSzr)
#create a top leverl sizer to add to the frame itself
mainSzr = wx.BoxSizer(wx.VERTICAL)
mainSzr.Add(posPnl, 1, wx.GROW)
self.SetSizerAndFit(mainSzr)
self.Show()
app = wx.App(False)
frame = MainWindow(None, "Trading Client")
app.MainLoop()
答案 1 :(得分:0)
我的应用程序的基本形式如下(parent - > child):
框架 - >面板 - > sizer - >窗口小部件/大小测定
对于某些事情,我这样做:
框架 - > sizer - >面板 - > sizer - >窗口小部件/大小测定
我是时候了。当你是一个新的程序员时,你通常想要在纸上画出你的GUI,然后在它们周围绘制框以试图找出哪些sizer工作,你想要嵌套它们等等。
您可以通过将 self.SetSizerAndFit(mainSzr)更改为 posPnl.SetSizerAndFit(mainSzr)
来解决此问题