【问题标题】:Arranging the panels automatically in wxPython在 wxPython 中自动排列面板
【发布时间】:2014-02-28 06:38:20
【问题描述】:

级别:初学者

我正在 Windows 操作系统上使用 wxPython 开发 GUI。我在安排面板时遇到了一些问题。我的 GUI 如下图所示(当然图中省略了菜单栏和标题栏)。

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

问题:

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

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

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

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

【问题讨论】:

  • 您在使用 BoxSizer 吗?如果没有,请在此处阅读它们:wiki.wxpython.org/BoxSizerFromTheGroundUp。您通常不会使用 pos() 定位子面板,而是使用扩展和比例控件将它们放入 box sizer 中,然后让 boxsizer 处理不同的窗口大小。
  • @GreenAsJade 谢谢,我正在为子面板使用 Boxsizers。我的问题与我的帖子中提到的面板而不是子面板有关。
  • 您也应该对面板使用 boxsizer :) 一个包含两个元素的垂直 box sizer:Panel5 和一个包含面板 1-4 的水平 box sizer。

标签: python user-interface wxpython wxwidgets


【解决方案1】:

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

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()

【讨论】:

  • 谢谢,我已经在我的代码中添加了sizer。不幸的是,这只解决了我的部分问题。就我而言,panel4 的大小不同!我必须在创建面板时指定 size=() 。我的代码在 1680x1050 屏幕上运行良好,因为我在创建框架时使用了这个尺寸。但是当屏幕尺寸变为某个小屏幕时,子面板不会出现在面板中!此外,在我的情况下,在调整框架大小时,面板等组件不会像你的那样调整大小!是因为我正在创建一个具有最大屏幕尺寸的框架吗?
  • 帧大小无关紧要。如果您需要让一个面板比另一个更大,则在将其添加到尺寸器时将其比例更改为更大。如果面板没有调整大小,那么您可能不会将它们全部放在 sizer 中。
  • 迈克,再次感谢您的建议。现在我想出了很多东西。 Sizer 真的让我们的生活变得简单。它减少了很多痛苦和代码行!我将在问题中为其他人发布我的代码。还有很多要学的。 :)
猜你喜欢
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多