繁体   English   中英

在wxPython中自动安排面板

[英]Arranging the panels automatically in wxPython

级别:初学者

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

在此处输入图片说明

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

问题:

  1. 但是,一旦我在屏幕尺寸为1366x768的计算机上运行代码,面板就无法正确定位! 如何使我的GUI根据屏幕尺寸的变化自动调整面板的布局。 我计划在平板电脑到大屏幕LCD的各种屏幕尺寸上使用我的GUI。 我想我必须创建一个大小调整器,以将这些名为panel-1的面板添加到panel4到某些主面板上? 还是有更好的方法?

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

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

PS:如果需要,我可以粘贴代码,但是我认为这并不重要,因为这只会增加帖子的长度,并且我试图详细解释我的问题。 但是我的代码对于1680x1050的屏幕效果很好。

您不能在不同的屏幕尺寸上使用绝对定位。 wxPython工具箱提供了可帮助您解决此问题的调整器。 如果您所有的小部件都在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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM