【问题标题】:wxPython GUI BoxSizerswxPython GUI BoxSizers
【发布时间】:2010-09-23 02:37:24
【问题描述】:

好的,我有一个正在编写代码的应用程序,并试图让布局变得更简单:

注意文本是如何左对齐的,输入框是如何对齐的,我在 wxPython 演示代码中看到了这一点,但它们都使用 flexgrid sizer,我试图只使用 BoxSizers(因为它们更简单,因为我只了解一点sizer,甚至在使用BoxSizers时也很吃力,6个月后我会更难过)

我尝试将输入和文本放在两个垂直大小调整器中,然后将它们放在水平大小调整器中,但由于文本未与输入对齐,所以没有用。我也尝试过这样做,并且还让每个文本、输入配对在一个 sizer 中,甚至更糟。有什么建议吗?

【问题讨论】:

  • 我的建议:如果您想要像这样的精美布局,您只需必须了解 flexgrid,boxsizer 只是不够灵活满足您苛刻的布局规范。
  • 我可以只用 BoxSizers 创建任何布局。您只需要一个 Vertical BoxSizer 和 3 个水平 BoxSizer。如果您需要在小部件之间留出空白,或者您可以只使用 sizer 标志,则需要在其中放置一些分隔符: mySizer.Add(widget, 0, wx.RIGHT, 10) 这意味着,在右侧添加 10 像素的缓冲区.

标签: python user-interface wxpython


【解决方案1】:

这是一个仅使用 BoxSizer 的简单示例:

import wx

class MyForm(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial")

        # Add a panel so it looks the correct on all platforms
        panel = wx.Panel(self, wx.ID_ANY)

        # create the labels
        lblOne = wx.StaticText(panel, label="labelOne", size=(60,-1))
        lblTwo = wx.StaticText(panel, label="lblTwo", size=(60,-1))
        lblThree = wx.StaticText(panel, label="lblThree", size=(60,-1))

        # create the text controls
        txtOne = wx.TextCtrl(panel)
        txtTwo = wx.TextCtrl(panel)
        txtThree = wx.TextCtrl(panel)

        # create some sizers
        mainSizer = wx.BoxSizer(wx.VERTICAL)
        lineOneSizer = wx.BoxSizer(wx.HORIZONTAL)
        lineTwoSizer = wx.BoxSizer(wx.HORIZONTAL)
        lineThreeSizer = wx.BoxSizer(wx.HORIZONTAL)

        # add widgets to sizers
        lineOneSizer.Add(lblOne, 0, wx.ALL|wx.ALIGN_LEFT, 5)
        lineOneSizer.Add(txtOne, 0, wx.ALL, 5)
        lineTwoSizer.Add(lblTwo, 0, wx.ALL|wx.ALIGN_LEFT, 5)
        lineTwoSizer.Add(txtTwo, 0, wx.ALL, 5)
        lineThreeSizer.Add(lblThree, 0, wx.ALL|wx.ALIGN_LEFT, 5)
        lineThreeSizer.Add(txtThree, 0, wx.ALL, 5)

        mainSizer.Add(lineOneSizer)
        mainSizer.Add(lineTwoSizer)
        mainSizer.Add(lineThreeSizer)

        panel.SetSizer(mainSizer)

# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

但这有点乱,所以这里有一个重构版本:

import wx

class MyForm(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial")

        # create the main sizer
        self.mainSizer = wx.BoxSizer(wx.VERTICAL)

        # Add a panel so it looks the correct on all platforms
        self.panel = wx.Panel(self, wx.ID_ANY)

        lbls = ["labelOne", "lblTwo", "lblThree"]
        for lbl in lbls:
            self.buildLayout(lbl)
        self.panel.SetSizer(self.mainSizer)

    #----------------------------------------------------------------------
    def buildLayout(self, text):
        """"""
        lblSize = (60,-1)
        lbl = wx.StaticText(self.panel, label=text, size=lblSize)
        txt = wx.TextCtrl(self.panel)

        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(lbl, 0, wx.ALL|wx.ALIGN_LEFT, 5)
        sizer.Add(txt, 0, wx.ALL, 5)
        self.mainSizer.Add(sizer)

# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

【讨论】:

    【解决方案2】:

    对于除了最基本的布局之外的大多数布局,您通常无法使用多种不同类型的尺寸器来实现您的设计。

    Here 是一个很好的关于sizer 的教程。

    【讨论】:

    • 嗨@volting,我相信你的“这里”链接指向同一个页面?!这是故意的吗?!
    • 嗯,这很奇怪,绝对不是故意的......我已经更新了一个教程的链接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2023-04-04
    • 1970-01-01
    • 2020-10-05
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多