如何在 wxPython 对话框中正确展开小部件?

How to correctly expand widgets in a wxPython dialog?

我试图让一个最小的 wxPython GUI 工作,但到目前为止我未能达到预期的结果。我想要的是扩展第一行中的文本输入小部件,使其填满 dialog/frame 的宽度。我希望输入框变宽,使其右边框与(更宽的)第二行中按钮的右边框对齐。

我认为这就是 wx.EXPAND 标志在添加到 sizer 时的作用,但显然我做错了什么。这是我在工作示例中的代码:

import wx

class MyApp(wx.Frame):
    def __init__(self):
        super(MyApp, self).__init__(None, title="wxPython Sizers", style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER)

        self.panel = wx.Panel(self)
        self.main_sizer = wx.BoxSizer(wx.VERTICAL)

        # First line, should expand it's width to fit the second line
        panel_sizer = wx.BoxSizer(wx.VERTICAL)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        text = wx.StaticText(self.panel, label="Short label:")
        hbox.Add(text, flag=wx.ALIGN_CENTER_VERTICAL)
        numtext = wx.TextCtrl(self.panel)
        hbox.Add(numtext, flag=wx.LEFT | wx.EXPAND, border=10)
        panel_sizer.Add(hbox)

        # The second, wider line
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        text = wx.StaticText(self.panel, label="This is a long label:")
        hbox.Add(text, flag=wx.ALIGN_CENTER_VERTICAL)
        img_folder_button = wx.Button(self.panel, label="Button")
        hbox.Add(img_folder_button, flag=wx.LEFT, border=10)
        panel_sizer.Add(hbox, flag=wx.TOP, border=15)

        # We need only this one sizer for the panel
        self.panel.SetSizer(panel_sizer)

        # Set final dialog layout
        self.main_sizer.Add(self.panel, proportion=1, flag=wx.ALL | wx.EXPAND, border=15)
        self.SetSizer(self.main_sizer)
        self.Layout()
        self.Fit()
        self.Center()
        self.Show()

if __name__ == "__main__":
    wxapp = wx.App()
    myApp = MyApp()
    wxapp.MainLoop()

您正在水平框大小调整器内扩展您的数字文本。这是正确的。但是您还必须在垂直框尺寸器内扩展水平框尺寸器。

proportionborder的用法一致。
而不是重复使用 hbox 单独声明它们并扩展按钮,以防用户扩展框架。

import wx

class MyApp(wx.Frame):
    def __init__(self):
        super(MyApp, self).__init__(None, title="wxPython Sizers", style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER)

        self.panel = wx.Panel(self)
        self.main_sizer = wx.BoxSizer(wx.VERTICAL)

        # First line, should expand it's width to fit the second line
        panel_sizer = wx.BoxSizer(wx.VERTICAL)
        hbox1 = wx.BoxSizer(wx.HORIZONTAL)
        text = wx.StaticText(self.panel, label="Short label:")
        hbox1.Add(text, flag=wx.ALIGN_CENTER_VERTICAL)
        numtext = wx.TextCtrl(self.panel)
        hbox1.Add(numtext, proportion=1, flag=wx.LEFT | wx.EXPAND, border=15)

        # The second, wider line
        hbox2 = wx.BoxSizer(wx.HORIZONTAL)
        text = wx.StaticText(self.panel, label="This is a long label:")
        hbox2.Add(text, flag=wx.ALIGN_CENTER_VERTICAL)
        img_folder_button = wx.Button(self.panel, label="Button")
        hbox2.Add(img_folder_button, proportion=1, flag=wx.LEFT | wx.EXPAND, border=15)
        panel_sizer.Add(hbox1, flag=wx.TOP | wx.EXPAND, border=15)
        panel_sizer.Add(hbox2, flag=wx.TOP | wx.EXPAND, border=15)

        # We need only this one sizer for the panel
        self.panel.SetSizer(panel_sizer)

        # Set final dialog layout
        self.main_sizer.Add(self.panel, proportion=1, flag=wx.ALL | wx.EXPAND, border=15)
        self.SetSizerAndFit(self.main_sizer)
        self.Layout()
        self.Center()
        self.Show()

if __name__ == "__main__":
    wxapp = wx.App()
    myApp = MyApp()
    wxapp.MainLoop()