在WxPython BoxSizer中均匀地调整多个项目的大小?

2024-05-16 02:21:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一个水平BoxSizer中堆叠多个小部件。但是,我有点意想不到的行为。大小调整器中的项目不是均匀地调整大小,而是在达到某个大小后,项目将随着窗口停止调整大小。在

我想这是最好的视觉理解。所以,在gif格式中:

当前行为:

enter image description here

如果您注意到的话,这两个TextCtrl会同步调整大小,直到接近中间标记,此时它们都停止调整大小,而是“推”到窗口下方。在

期望行为:

enter image description here

理想的行为是,即使是最小的尺寸,这两个TextCtrl仍将被平均分割(以上是通过photoshop实现的)

对于显示的两个小部件,这并不是一个大问题,因为在出现不均匀TextCtrl问题之前,窗口的大小可以比任何用户都小。然而!在实际应用程序中,我需要将其中的3-5个(由各种小部件类型组成)堆叠在一起。虽然两个不是问题,但添加更多(特别是添加空格和填充时)会很快使问题更加明显。在

enter image description here

完整代码:

import wx
from wx.lib.scrolledpanel import ScrolledPanel


class TestPanel(ScrolledPanel):
  def __init__(self, parent):
    ScrolledPanel.__init__(self, parent)
    self.SetupScrolling(scroll_x=False)

    self.textctrls = [wx.TextCtrl(self) for _ in range(4)]

    sizer = wx.BoxSizer(wx.VERTICAL)
    hsizer = wx.BoxSizer(wx.HORIZONTAL)
    for textctrl in self.textctrls:
      hsizer.Add(textctrl, 1, wx.EXPAND)

    sizer.Add(hsizer, 0, wx.EXPAND)
    self.SetSizer(sizer)

class MyFrame(wx.Frame):
  def __init__(self, parent):
    wx.Frame.__init__(self, parent, title="test", size=(320, 240))
    self.SetBackgroundColour('#ffffff')
    self.panel = TestPanel(self)
    self.Show()

if __name__ == '__main__':
  app = wx.App(False)
  MyFrame(None)
  app.MainLoop()

代码应该相对直接。所有繁重的列表都在ScrolledPanel子类中完成。我创建按钮,将每个按钮添加到水平BoxSizer,最后将水平大小调整器添加到垂直容器中。在

有人能找出为什么sizer中的小部件没有正确调整大小吗?在


Tags: 项目代码importselfinit部件水平parent
1条回答
网友
1楼 · 发布于 2024-05-16 02:21:29

将textcrls minsize设置为零,这样它们就可以比默认的minsize小。在

import wx
from wx.lib.scrolledpanel import ScrolledPanel


class TestPanel(ScrolledPanel):
  def __init__(self, parent):
    ScrolledPanel.__init__(self, parent)
    self.SetupScrolling(scroll_x=False)

    self.textctrls = [wx.TextCtrl(self) for _ in range(4)]

    sizer = wx.BoxSizer(wx.VERTICAL)
    hsizer = wx.BoxSizer(wx.HORIZONTAL)
    for textctrl in self.textctrls:
      hsizer.Add(textctrl, 1, wx.EXPAND)
      textctrl.SetMinSize((0, -1))

    sizer.Add(hsizer, 0, wx.EXPAND)
    self.SetSizer(sizer)

class MyFrame(wx.Frame):
  def __init__(self, parent):
    wx.Frame.__init__(self, parent, title="test", size=(320, 240))
    self.SetBackgroundColour('#ffffff')
    self.panel = TestPanel(self)
    self.Show()

if __name__ == '__main__':
  app = wx.App(False)
  MyFrame(None)
  app.MainLoop()

相关问题 更多 >