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

时间:2014-03-12 09:43:01

标签: wxpython

我正在用wx.python编写一个脚本来从wx.ComboBox中选择一个值,然后,根据从ComboBox中选择的值,必须出现一些小部件(textcontrols和静态文本)。 我在管理布局时遇到问题:我想将小部件放在FlexGrid Box中,但由于我是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行之间。您能否建议我如何管理布局。提前致谢

1 个答案:

答案 0 :(得分:0)

您有很多父/子关系错误。 创建了一个新的面板 panel1 但是ctrls没有被赋予这个面板作为父节点,它们被赋予了作为框架子节点的面板。

panel1 是框架的父级,是你想要它的方式,还是它应该是框架面板的子框架。

panel1 尚未添加到相应的sizer

方法SetSizerAndFit我不确定你是否需要在框架面板上使用它只需使用SetSizer shold即可。

在初始设置后添加sizer时,通常需要调用Layout方法以使sizer适应新控件。

相关问题