wxPython:单击组合框后显示小部件

wxPython:单击组合框后显示小部件,wxpython,Wxpython,我正在用wx.python编写一个脚本,从wx.ComboBox中选择一个值,然后,根据从ComboBox中选择的值,必须出现一些小部件(文本控件和静态文本)。 我在管理布局方面遇到了一个问题:我想将小部件放在FlexGrid框中,但由于我是wxpython的新手,所以遇到了一些问题。这是我的密码 import wx,os,subprocess class ExampleFrame(wx.Frame): def __init__(self, parent): wx.Frame.__in

我正在用wx.python编写一个脚本,从wx.ComboBox中选择一个值,然后,根据从ComboBox中选择的值,必须出现一些小部件(文本控件和静态文本)。 我在管理布局方面遇到了一个问题:我想将小部件放在FlexGrid框中,但由于我是wxpython的新手,所以遇到了一些问题。这是我的密码

import wx,os,subprocess
class ExampleFrame(wx.Frame): 
def __init__(self, parent):
    wx.Frame.__init__(self, parent)

    self.panel = wx.Panel(self)
    self.quote = wx.StaticText(self.panel, label="Test:")  
    self.result = wx.StaticText(self.panel, label="")
    self.result.SetForegroundColour(wx.RED)
    self.quote1 = wx.StaticText(self.panel, label="select a choice")
    distros = ['Choice1', 'Choice2']
    self.cb = wx.ComboBox(self.panel, choices=distros, style=wx.CB_READONLY) 
    self.button = wx.Button(self.panel, label="Begin")

    # Set sizer for the frame, so we can change frame size to match widgets
    self.windowSizer = wx.BoxSizer()
    self.windowSizer.Add(self.panel, 1, wx.ALL | wx.EXPAND)        

    # Set sizer for the panel content
    self.sizer = wx.GridBagSizer(7, 7)
    self.sizer.Add(self.quote, (0, 0))
    self.sizer.Add(self.result, (0, 1))
    self.sizer.Add(self.quote1,(1,0))
    self.sizer.Add(self.cb, (1, 1))
    self.sizer.Add(self.button, (6, 0), (5, 2))

    # Set simple sizer for a nice border
    self.border = wx.BoxSizer()
    self.border.Add(self.sizer, 1, wx.ALL | wx.EXPAND, 5)

    # Use the sizers
    self.panel.SetSizerAndFit(self.border)  
    self.SetSizerAndFit(self.windowSizer)  
    self.SetSize((250, 230))
    self.SetTitle('Example')
    self.Centre()

    # Set event handlers
    self.button.Bind(wx.EVT_BUTTON, self.OnButton)
    self.cb.Bind(wx.EVT_COMBOBOX, self.OnSelect)
def OnSelect(self,e):
    distros = ['Choice1', 'Choice2']
    i = e.GetString()
    if i == distros[0]:
        self.result.SetLabel("1")
        self.res="1"
        panel1= wx.Panel(self)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        fgs = wx.FlexGridSizer(3, 2, 9, 25)
        lblname = wx.StaticText(self.panel, label="label1")
        tc1 = wx.TextCtrl(self.panel)
        fgs.AddMany([(lblname), (tc1, 1, wx.EXPAND)])
        fgs.AddGrowableRow(2, 1)
        fgs.AddGrowableCol(1, 1)
        hbox.Add(fgs, proportion=1, flag=wx.ALL|wx.EXPAND, border=15)
        panel1.SetSizer(hbox)

    elif i==distros[1]:
        self.result.SetLabel("2")
        self.res="2"
def OnButton(self, e):
    if self.res=="1":
        wx.MessageBox('choice1','info',wx.OK)
    elif self.res=="2":
        wx.MessageBox('choice2','info',wx.OK)
app = wx.App(False)
frame = ExampleFrame(None)
frame.Show()
app.MainLoop()

我的问题在第47行和第56行之间。你能建议我如何管理布局吗。提前感谢

您有很多父母/子女关系错误。 创建了一个新的面板panel1,但CTRL没有将此面板作为父面板,而是将该面板作为框架的子面板

panel1是框架的父级,这就是您希望它是框架面板的子级还是应该是框架面板的子级

panel1尚未添加到相应的大小设置中

方法SetSizerAndIt我不确定您是否需要在框架面板上使用它,仅使用SetSizer就足够了

当在初始设置之后添加大小调整器时,通常需要调用方法布局,以使大小调整器适应新控件