如何使嵌套的Panel和Sizer在wxpython中工作

时间:2012-05-28 14:34:32

标签: python wxpython

我正在学习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”字样。我在这里做错了什么?

2 个答案:

答案 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)

来解决此问题