防止wxPython中的面板扩展

2 投票
1 回答
1929 浏览
提问于 2025-04-17 16:54

我正在尝试在wxPython中排列一些面板。下面是布局的大致示意图:所需布局的抽象示例。

简单来说,我想要一个左侧和右侧的面板,左侧的面板(橙色)及其内容在调整大小时永远不变,而右侧的面板(蓝色)可以根据需要水平拉伸/扩展。

到目前为止,我写的代码(里面有一些随机的填充控件)如下。我的问题在代码之后:

import wx
import wx.lib.scrolledpanel as scrolled

class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent)

        #add position panel
        posPnl = IdPanel(self)
        lbl1 = wx.StaticText(posPnl, label="Position")
        lbl2 = wx.StaticText(posPnl, label="Size")
        sizeCtrl = wx.TextCtrl(posPnl)

        posPnlSzr = wx.BoxSizer(wx.VERTICAL)
        posPnlSzr.Add(lbl1, 1, wx.FIXED&wx.LEFT)
        posPnlSzr.Add(sizeCtrl, 1, wx.LEFT&wx.FIXED)
        posPnlSzr.Add(lbl2, 1, wx.FIXED&wx.LEFT)

        posPnl.SetSizer(posPnlSzr)

        posPnl2 = TimelinePanel(self)
        lbl12 = wx.StaticText(posPnl2, label="Position")
        lbl22 = wx.StaticText(posPnl2, label="Size")
        sizeCtrl2 = wx.TextCtrl(posPnl2)

        posPnlSzr2 = wx.BoxSizer(wx.VERTICAL)
        posPnlSzr2.Add(lbl12, 1, wx.GROW)
        posPnlSzr2.Add(sizeCtrl2, 1, wx.GROW)
        posPnlSzr2.Add(lbl22, 1, wx.GROW)

        posPnl2.SetSizer(posPnlSzr2)

        mainSzr = wx.BoxSizer(wx.HORIZONTAL)
        mainSzr.Add(posPnl, 1, wx.FIXED)
        #mainSzr.AddSpacer(10)
        mainSzr.Add(posPnl2, 1, wx.GROW)

        self.SetSizerAndFit(mainSzr)
        self.Show()

class IdPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1, size = (400, 200))
        self.SetBackgroundColour((255, 0, 255))

class TimelinePanel(scrolled.ScrolledPanel):
    def __init__(self, parent):
        scrolled.ScrolledPanel.__init__(self, parent, -1, size = (300, 200))
        self.SetBackgroundColour((255, 0, 0))


app = wx.App(False)
frame = MainWindow(None, "Trading Client")
app.MainLoop()

我的问题:

  1. 我该如何使用sizers来确保只有右侧面板扩展,并且仅限于水平扩展?目前左侧面板的内容保持固定,但面板本身还是会扩展。
  2. 如果我想稍微修改第一个问题,让右侧面板水平扩展,但两个面板都可以垂直扩展,我需要怎么做?
  3. 我在右侧面板使用了wx.lib.scrolledpanel来处理x轴,但我似乎无法将窗口水平收缩到足够小,以便它能显示出来。我不确定是否有关于面板大小的最小/最大设置可以帮助解决这个问题?

1 个回答

6

1: 在把你的两个面板添加到主布局时,使用 proportion 参数:

mainSzr.Add(posPnl, 0)
mainSzr.Add(posPnl2, 1)

这个比例会影响面板在和其他兄弟布局之间的大小变化(0表示不改变大小)。而 wx.FIXEDwx.GROW 这两个标志和你的目标没有关系。

http://wxpython.org/docs/api/wx.Sizer-class.html#Add

举个例子,如果你想让两个面板都变大,但右边的面板变大的速度是左边的两倍,你可以这样设置:

mainSzr.Add(posPnl, 1)
mainSzr.Add(posPnl2, 2)

2: 使用 wx.EXPAND 标志,可以让在水平布局中的某个元素扩展以填满它的垂直空间(如果是垂直布局则相反,填满水平空间)。

mainSzr.Add(posPnl, 0, wx.EXPAND)
mainSzr.Add(posPnl2, 1, wx.EXPAND)

3: 在 TimelinePanel 的 __init__ 函数中添加 self.SetupScrolling(),这是让滚动面板正常工作的必要步骤。这样,当面板的内容足够大需要滚动条时,滚动条就会自动添加上去。

撰写回答