3

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

4

2 回答 2

4

这里的逻辑是创建一个Panel以在其中添加控件,然后在BoxSizer其中声明您添加的每个控件在Panel调整大小时的行为方式,并最终设置应用在其上的Panel内容BoxSizer

你有2个问题。

  • 首先,您缺少上述posPnl对象语句的最后一部分。添加这个:

    posPnl.SetSizer(posPnlSzr)
    

    将控件添加到posPnlSzr

  • 第二个问题是您正在posSnlSzr添加mainSzr. 这样做是错误的。同样,逻辑是将控件添加到 sizer,您可以将 aPanel视为复合控件。因此,正确的代码是添加posPnlmainSzr

    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()
于 2012-05-28T15:09:59.817 回答
0

我的应用程序的基本形式是这样的(父 --> 子):

框架 --> 面板 --> 大小调整器 --> 小部件/大小调整器

对于某些事情,我这样做:

框架 --> 尺寸器 --> 面板 --> 尺寸器 --> 小部件/尺寸器

我的筑巢器是时候了。当你是一个新程序员时,你通常想在纸上勾勒出你的 GUI,然后在它们周围画框,试图找出哪些尺寸器可以工作,你想在哪里嵌套它们,等等。

您只需将self.SetSizerAndFit(mainSzr)更改为posPnl.SetSizerAndFit (mainSzr) 即可解决此问题

于 2012-05-29T13:58:32.640 回答