【问题标题】:wxPython - picking the right sizer to use in an applicationwxPython - 选择正确的大小以在应用程序中使用
【发布时间】:2009-12-12 03:00:25
【问题描述】:

我无法弄清楚如何让 wxPython 中的 sizer 按我希望的方式工作(除此之外:我是唯一一个认为 wxPython 记录不充分的人吗?)。我有 4 个按钮和一个 textctrl,我想像这样安排:

==============================================
|WINDOW TITLE                          _ [] X|
|============================================|
|Button1  |  Button2  |   Button3  |  Button4|
|--------------------------------------------|
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxTextCtrlxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
==============================================

按钮应该水平扩展,而不是垂直扩展,并且 textctrl 应该水平和垂直扩展。我已经尝试了 wxPython 演示程序中列出的几乎所有尺寸器,但它们都不起作用 - 多个 boxsizer、gridsizers + boxsizeres、plain gridsizer、flexgridsizer 和 rowcolsizer,但它们都不起作用,有人可以帮忙吗?作为参考,这是我现在得到的代码。

            ...snip...
            panel = wx.Panel(self, -1)
            select_file = wx.Button(panel, self.BUTTON_0, "Select File")
            button1 = wx.Button(panel, self.BUTTON_1, "250 Words") 
            button2 = wx.Button(panel, self.BUTTON_2, "500 Words") 
            button3 = wx.Button(panel, self.BUTTON_3, "750 Words") 
            self.txt = wx.TextCtrl(panel, -1, "", style=wx.TE_MULTILINE | wx.TE_READONLY)

            # Now to re-do this with gridsizers instead.
            # 4 rows, 4 columns, 2 pixel gap horizontally and vertically.
            grid = rcs.RowColSizer()

            # These buttons need to expand to fill their space, and then
            # expand when the windows are resized.
            grid.Add( select_file, row=1, col=1 )
            grid.Add( button1, row=1, col=2 )
            grid.Add( button2, row=1, col=3 )
            grid.Add( button3, row=1, col=4 )
            grid.Add( self.txt, row=2, col=1 )
            ...snip...

【问题讨论】:

    标签: wxpython


    【解决方案1】:

    我花了一段时间才弄明白。这是我一直用 wxPython 做的事情。本质上,您需要嵌套 box sizers。您需要一个垂直的 box sizer 来容纳两个水平的 box sizer。

    这是您需要的代码:

    import wx
    
    class sizertest(wx.Panel):
    
        def __init__(self,parent):
            wx.Panel.__init__(self,parent)
            vsizer = wx.BoxSizer(wx.VERTICAL)
            hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
    
            button1 = wx.Button(self,-1,"button 1")
            self.Bind( wx.EVT_BUTTON,self.button1,button1)
            hsizer1.Add(button1,1,wx.EXPAND)
    
            button2 = wx.Button(self,-1,"button 2")
            self.Bind( wx.EVT_BUTTON,self.button2,button2)
            hsizer1.Add(button2,1,wx.EXPAND)
    
            vsizer.Add(hsizer1,.1,wx.EXPAND)
            self.SetSizer(vsizer)
    
            tc = wx.TextCtrl(self,-1,"",style=wx.TE_MULTILINE)
            hsizer2 = wx.BoxSizer(wx.HORIZONTAL)
            hsizer2.Add(tc,1,wx.EXPAND)
            vsizer.Add(hsizer2,1,wx.EXPAND)
    
        def button1(self,event):pass
        def button2(self,event):pass
    
    
    if __name__ == "__main__":
        app = wx.App()
        frame = wx.Frame(parent=None, id=-1, title="sizer test")
        panel = sizertest(frame)
    
        frame.Show()
        app.MainLoop()
    

    垂直尺寸器 vsizer 拥有两个水平尺寸器。第一个水平大小调整器包含您想要添加的任意数量的按钮,并且它们可以水平扩展。因为您将其添加到垂直尺寸器中,其“重量”的数字小于 1,所以它不会垂直扩展。第二个水平大小调整器包含文本控件,它可以扩展以占用所有剩余的水平和垂直空间。两个 sizer 都会随着窗口的展开而展开。

    我建议您阅读 Rappin 和 Dunn 所著的 wxPython in Action 一书 - 它确实帮助我了解 wxPython 大小调整器和屏幕布局的工作原理。

    我 99% 的 wxPython 程序都使用嵌套 boxsizer。

    简单

    【讨论】:

    • 是的,嵌套的 box sizer 也是我的常用方法。
    • +1 我主要使用(嵌套)boxsizers 和 flexgridsizers。是的,wxpython 的文档记录很差,这是一个普遍的事实。我推荐邮件列表,只需遵循几个星期,您就会跟上进度。
    【解决方案2】:

    维基上有很多信息,例如查看http://wiki.wxpython.org/UsingSizers。底部的图片很好地展示了所有标志和函数参数的工作方式。

    其他很好的例子是 -zetcode 并且不要忘记检查 wxwidgets 页面。

    示例/演示应用程序也很棒,可从 wxpython 下载页面获得。由于是 StackOverflow 的新用户,我无法提供多个链接。

    在玩了一段时间后,它们应该会“打勾”——我发现使用它们可以让创建我的 GUI 变得轻而易举。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      相关资源
      最近更新 更多