【发布时间】:2021-12-21 00:39:00
【问题描述】:
我正在尝试制作这样的 GUI:
大方块是 wxGrid,小方块是 wxButton,它们都表现得很好。左图是一个 wxSlider,在滑块的每一端下方都有文本标签“慢”和“快”。
所以我布置了一堆 BoxSizer,如下所示:
由外而内:
- 蓝色是垂直的,包含一个 wxGrid 和绿色的 BoxSizer
- 绿色是水平的,包含橙色 BoxSizer 和两个按钮
- 橙色是垂直的,包含一个 wxSlider 和紫色 BoxSizer
- Purple 是水平的,包含两个 StaticText,分别是“slow”和“fast”
但我能得到的最接近渲染的是这个。 特别注意滑块是多么的小,而慢速和快速标签(旨在标记滑块的末端!)是一团糟。
我搞砸了对齐和扩展,我读过很多其他人抱怨 BoxSlider 的帖子,但我一无所获。当我读到有关 wx.ST_NO_AUTORESIZE 的信息时,我以为我肯定拥有它,但这并没有做任何事情。我什至用 wxGlade 重建了我的窗口,得到了同样的结果,尤其是在最左边的静态文本。
我没有做的一件事是指定任何东西的大小(以像素为单位)。似乎任何布局都不需要这样做,因为谁知道我将在什么尺寸的屏幕上运行或合理的像素数是多少。如果我在 sizers 中正确理解了比例,我就不必以像素为单位指定大小。
但是我没有想法,我什至没有找到一个很好的例子,只是类似的挫败感。 如何让我的滑块占据橙色 boxsizer 的整个宽度,以及如何让慢速和快速文本标记滑块的末端?
我正在运行的内容,剥离到布局要素(它有滑块和标签问题):
import wx
import wx.grid
app = wx.App()
frame = wx.Frame(None, title="MyUnhappyLayout")
blue_sizer = wx.BoxSizer(wx.VERTICAL)
grid = wx.grid.Grid(frame)
blue_sizer.Add(grid, 6, wx.EXPAND, 8)
green_sizer = wx.BoxSizer()
blue_sizer.Add(green_sizer, 1, wx.EXPAND)
button1 = wx.Button(frame)
button2 = wx.Button(frame)
slider = wx.Slider(frame, name="Speed", value=1, minValue=1, maxValue=100)
purple_sizer = wx.BoxSizer()
label_slow = wx.StaticText(frame, label="Slow")
label_fast = wx.StaticText(frame, label="Fast")
purple_sizer.Add(label_slow, wx.ALIGN_LEFT)
purple_sizer.Add(label_fast, wx.ALIGN_RIGHT)
orange_sizer = wx.BoxSizer(wx.VERTICAL)
green_sizer.Add(orange_sizer, 2)
orange_sizer.Add(slider)
orange_sizer.Add(purple_sizer, wx.EXPAND)
green_sizer.Add(button1, 1, wx.EXPAND)
green_sizer.Add(button2, 1, wx.EXPAND)
frame.SetSizerAndFit(blue_sizer)
frame.Show()
app.MainLoop()
【问题讨论】:
-
您能否发布有关如何创建滑块以及如何将其添加到 sizer 的代码?还有你正在尝试的 wxPython 版本和操作系统是什么?
-
@Igor,是的 - 刚才发布了代码。我正在运行 Win10、Python 3.9.2 和 wxPython 4.1.1
-
你试过
orange_sizer.Add(slider, 1, wx.EXPAND) -
@Igor - 当我将几行更改为:
orange_sizer.Add(slider, 1, wx.EXPAND); orange_sizer.Add(purple_sizer, 1, wx.EXPAND)时,至少让我的滑块成为橙色尺寸器的整个宽度。没有这两项更改就无法工作,并且仍然无法修复文本。因为我不知道如何在这个框中放一个 \n,所以我给了 Python 一个假想的分号 :)
标签: python layout wxpython wxwidgets sizer