【问题标题】:wxPython: How to fix the size of one part of a grid sizerwxPython:如何修复网格尺寸器一部分的大小
【发布时间】:2011-05-24 16:41:45
【问题描述】:

我想要做的是创建 3 列随着窗口的展开而展开。但我想对其进行限制,以便不同的列扩展到不同的最大数量。

我在这里所做的是使用 wxGlade 创建一个带有 1 行和 3 列的网格尺寸器的框架。我希望 Part1 具有固定宽度“A”,Part2 具有固定宽度“B”,Part3 能够正常扩展。

我该怎么做?

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
# generated by wxGlade 0.6.3 on Tue May 24 11:35:21 2011

import wx

# begin wxGlade: extracode
# end wxGlade



class MyFrame1(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyFrame1.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.panel_1 = wx.Panel(self, -1)
        self.sizer_10_staticbox = wx.StaticBox(self.panel_1, -1, "Part2")
        self.sizer_11_staticbox = wx.StaticBox(self.panel_1, -1, "Part3")
        self.sizer_9_staticbox = wx.StaticBox(self.panel_1, -1, "Part1")

        self.__set_properties()
        self.__do_layout()
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: MyFrame1.__set_properties
        self.SetTitle("frame_2")
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: MyFrame1.__do_layout
        sizer_8 = wx.BoxSizer(wx.VERTICAL)
        grid_sizer_4 = wx.GridSizer(1, 3, 0, 0)
        sizer_11 = wx.StaticBoxSizer(self.sizer_11_staticbox, wx.HORIZONTAL)
        sizer_10 = wx.StaticBoxSizer(self.sizer_10_staticbox, wx.HORIZONTAL)
        sizer_9 = wx.StaticBoxSizer(self.sizer_9_staticbox, wx.HORIZONTAL)
        grid_sizer_4.Add(sizer_9, 1, wx.EXPAND, 0)
        grid_sizer_4.Add(sizer_10, 1, wx.EXPAND, 0)
        grid_sizer_4.Add(sizer_11, 1, wx.EXPAND, 0)
        self.panel_1.SetSizer(grid_sizer_4)
        sizer_8.Add(self.panel_1, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_8)
        sizer_8.Fit(self)
        self.Layout()
        # end wxGlade

# end of class MyFrame1


if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    frame_2 = MyFrame1(None, -1, "")
    app.SetTopWindow(frame_2)
    frame_2.Show()
    app.MainLoop()

【问题讨论】:

  • wxGlade 的命名约定让我感到恶心。 self.sizer_11_staticbox?在大型项目中,几乎不可能知道某些布局功能中发生了什么。

标签: python wxpython sizer


【解决方案1】:

如果您使用的是GridSizer,我可能会建议您改用GridBagSizer

一旦你决定它是否可用,那么你可能需要研究sizer.AddGrowableRow(row)sizer.AddGrowableCol(col) 方法。它们允许您指示网格中扩展的列或行。它们不使用您在 BoxSizer 中熟悉的使用比例(因此,如果两列增长,它们都以相同的速率增长),但您可以设置一些扩展而其他不扩展。

索引是从零开始的,所以根据你的描述,我猜想gridbagsizer_4.AddGrowableCol(2) 之类的东西,但就像我的评论所说,wxGlade 的命名约定让我感到不适,而且很难确定,而且这些方法将不可用在 GridSizer 上。

对于任何感兴趣的人,这里有一篇介绍我的表单构建和表单对话框类的帖子:Form Builder。将它发布在我可以包含附件的网站上比尝试将其全部粘贴在这里更容易。

【讨论】:

  • 我会检查一下,从来没有听说过 GridBagSizer .... 你的正确,我不喜欢 wxGlades 命名约定 - 但作为一个快速模拟 GUI 的工具,我喜欢它胜过任何东西否则,意思是 BoaConstructor。
  • 对于一个快速的工具是可以的,但是如果你以后需要自定义它就变得很头疼了。实际上,我最终推出了自己的表单生成器和表单对话框类,它们接收结构化对象并将其解析为完整表单。它可以自动创建和放置 sizer,这在我的书中是一个巨大的优势。如果你有兴趣,我愿意给你拍一份。另外,你可以看看 XRCed - 它类似于 wxGlade,但使用的 XML 结构并不可怕。
  • 我现在正在尝试 XRCed,但似乎无法让 GridBagSizer 正常工作。你能模拟一个例子来说明我上面的问题应该是什么样子吗?我可以创建 GridBagSizer,但是当我尝试向其添加静态 sizer 时,它会出错。也一直在尝试 FlexGridSizer,但到目前为止我还无法正确设置最小/最大尺寸。
  • sizer 可以有最小尺寸吗?作为测试,我创建了一个 wxStaticBox 并能够将其强制为最小尺寸。然后我创建了一个 wxStaticBoxSizer 并使用了相同的选项,使用 wxFixed_MINSIZE 没有效果
  • 据我了解,sizer 应该确定自己的最小尺寸。所以我想我需要做的是能够定义单个列的最大大小。 GridBag 和 FlexGrid '应该' 能够通过将特定列设置为增长而将其他列设置为静态大小来做到这一点。但到目前为止,我还不能让它充分发挥作用
猜你喜欢
  • 2020-05-03
  • 2019-09-18
  • 2013-05-26
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 2014-01-09
  • 2020-01-27
  • 1970-01-01
相关资源
最近更新 更多