在wxPython中自动排列面板

时间:2014-02-04 10:36:11

标签: python user-interface wxpython wxwidgets

等级:初学者

我正在Windows OS上使用wxPython开发GUI。我在安排面板方面遇到了一些问题。我看起来像下面的图像(当然,图像中省略了菜单栏和标题栏。)

enter image description here

我需要一些时间来解释如何创建这个GUI。首先,我使用wx.DisplaySize()获取屏幕尺寸。然后我使用pos=()相应地调整我的面板。主要有4个面板,名为panel-1到panel-4。每个面板都包含子面板。子面板的数量不是常数。我使用for循环来创建子面板并将其添加到面板。将子面板添加到分级器中,然后将分级器最终应用于相应的面板。根据{{​​1}},我的屏幕尺寸为1680x1050。目前一切都很好。

问题:

  1. 但是,只要我在屏幕尺寸为1366x768的机器上运行我的代码,面板就无法正确定位!如何根据屏幕尺寸的变化使我的GUI自动调整面板的排列。我打算在从平板电脑到大屏幕液晶显示器的各种屏幕尺寸上使用我的GUI。我想我必须创建一个sizer,将名为panel-1的这些面板添加到panel4到一些主要的任意面板?或者有更好的方法吗?

  2. 目前我已禁用框架的resize选项。因为当我调整框架大小时(启用选项时)主窗口会调整大小,但主窗口内的组件(面板,按钮)不会调整大小。如何启用此功能,以便在调整主窗口大小时,内部组件也会相应调整大小?

  3. 我在创建这种GUI时的方法可能有误。我期待任何可以简化方式创建这种GUI的建议! 谢谢你的时间。

    PS:如果需要我可以粘贴代码,但我认为它不重要,因为它只会增加帖子长度,因为我试图详细解释我的问题。但是我的代码适用于屏幕尺寸1680x1050。

1 个答案:

答案 0 :(得分:3)

您不能在不同的屏幕尺寸上使用绝对定位。 wxPython工具包提供了可帮助您解决此问题的sizer。如果您的所有小部件都在sizer中,它们将自动适当调整大小。这是一个与您的设计非常相似的实现:

import wx

########################################################################
class SubPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent, number):
        """Constructor"""
        wx.Panel.__init__(self, parent)
        self.SetBackgroundColour("red")

        label = "Sub panel-%s" % number
        lbl = wx.StaticText(self, label=label)

        sizer = wx.BoxSizer()
        sizer.Add(lbl, 0, wx.ALL|wx.CENTER, 5)
        self.SetSizer(sizer)

########################################################################
class ColorPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent, number, color, sub_panels):
        """Constructor"""
        wx.Panel.__init__(self, parent)
        self.SetBackgroundColour(color)

        label = "Panel-%s" % number
        lbl = wx.StaticText(self, label=label)

        v_sizer = wx.BoxSizer(wx.VERTICAL)
        for i in range(sub_panels):
            p = SubPanel(self, i+1)
            v_sizer.Add(p, 0, wx.ALL|wx.EXPAND|wx.CENTER, 10)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(v_sizer, 0, wx.ALL, 5)
        sizer.Add(lbl, 0, wx.ALL|wx.CENTER, 5)
        self.SetSizer(sizer)

########################################################################
class MainPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        hsizer = wx.BoxSizer(wx.HORIZONTAL)
        v_sizer = wx.BoxSizer(wx.VERTICAL)

        colors = [("green", 3),
                  ("yellow", 2),
                  ("light blue", 2),
                  ("purple", 2)]
        count = 1
        for color, subpanel in colors:
            panel = ColorPanel(self, count, color, subpanel)
            hsizer.Add(panel, 1, wx.EXPAND)
            count += 1

        orange_panel = ColorPanel(self, count, "orange", 0)
        v_sizer.Add(hsizer, 1, wx.EXPAND)
        v_sizer.Add(orange_panel, 1, wx.EXPAND)

        self.SetSizer(v_sizer)

########################################################################
class MainFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Panels!", size=(600,400))
        panel = MainPanel(self)
        self.Show()

#----------------------------------------------------------------------
if __name__ == "__main__":
    app = wx.App(False)
    frame = MainFrame()
    app.MainLoop()