[英]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。 目前,一切正常。
问题:
但是,一旦我在屏幕尺寸为1366x768的计算机上运行代码,面板就无法正确定位! 如何使我的GUI根据屏幕尺寸的变化自动调整面板的布局。 我计划在平板电脑到大屏幕LCD的各种屏幕尺寸上使用我的GUI。 我想我必须创建一个大小调整器,以将这些名为panel-1的面板添加到panel4到某些主面板上? 还是有更好的方法?
目前,我已禁用框架的调整大小选项。 因为当我调整框架的大小(启用选项时)时,主窗口会被调整大小,但是主窗口中的组件(面板,按钮)不会被调整大小。 如何启用此功能,以便在调整主窗口大小时也相应地调整内部组件的大小?
在创建这种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.