我正在用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行之间。您能否建议我如何管理布局。提前致谢
答案 0 :(得分:0)
您有很多父/子关系错误。 创建了一个新的面板 panel1 但是ctrls没有被赋予这个面板作为父节点,它们被赋予了作为框架子节点的面板。
panel1 是框架的父级,是你想要它的方式,还是它应该是框架面板的子框架。
panel1 尚未添加到相应的sizer
中方法SetSizerAndFit我不确定你是否需要在框架面板上使用它只需使用SetSizer shold即可。
在初始设置后添加sizer时,通常需要调用Layout方法以使sizer适应新控件。