在wxPython中刷新面板内容
在wxPanel中,如何根据同一面板上其他控件的事件来更新小部件呢?
场景1是根据另一个下拉框中选择的内容来更新一个下拉框的列表,这两个下拉框都在同一个面板里。
场景2是根据某个事件在面板上显示一个新的控件或小部件。
其实创建新的控件很简单,但我不知道怎么刷新或更新我的面板,让它立刻显示出来。
2 个回答
对于第一种情况,你可以这样做(假设第一个下拉框已经绑定了它的事件):
value = self.cboOne.GetValue()
if value == "something":
self.cboTwo.SetItems(someList)
如果你想显示一个新的控件,可以先创建它,然后根据需要使用 Show() 或 Hide() 来显示或隐藏。如果这个控件在一个布局管理器(sizer)里面,那么就可以使用布局管理器的 Append 或 Insert 方法来添加它。布局管理器还有一个 Detach 方法,可以用来隐藏控件,或者你也可以直接调用 Hide 方法。想了解更多信息,可以查看这个文档:http://www.wxpython.org/docs/api/wx.Sizer-class.html
场景 1
如果你想改变一个下拉框 self.cbx
的选项,可以用以下几种方法:
self.cbx.SetItems(choices)
这个方法可以设置所有的选项,choices 是一个完整的选项列表。
self.cbx.SetString(n, string)
这个方法可以在第 n 个位置设置一个字符串。
InsertItems(items, pos)
这个方法可以把 items 参数中的字符串列表插入到 pos 参数指定的位置之前。
需要注意的是,列表框的 Set(choices)
方法在下拉框中是不存在的。你必须使用 SetItems(choices)
来替代(有些教材没有明确说明这一点)。
如果你希望这些变化是因为另一个下拉框 self.cbx_1
的选择而发生的,只需获取第一个下拉框的事件 (self.Bind(wx.EVT_COMBOBOX, on_combo_1, self.cbx_1)
),在对应的 self.on_combo
方法中处理你的数据,然后使用上述方法之一来修改第二个下拉框。
例如:
def on_combo_1(self, evt):
"append cbx_1 selection to cbx if not already in cbx"
selection = self.cbx_1.GetStringSelection()
cbx_choices = self.cbx.GetItems()
if selection not in cbx_choices:
cbx_choices.append(selection)
self.cbx.SetItems(cbx_choices)
下拉框是否在同一个面板或不同面板中并不重要。
场景 2
通常你会把你的控件放在布局管理器里面。要隐藏或显示布局管理器中的元素,你可以调用 Show
、Hide
或 Layout
方法:
Show(self, item, show=True, recursive=false)
这个方法可以显示或隐藏布局管理器管理的一个项目。要让一个布局项目消失或重新出现,使用 Show
然后跟上 Layout
。项目参数可以是一个窗口、一个布局管理器,或者是项目的零基索引。使用递归参数可以在子布局中显示或隐藏一个项目。如果找到了这个项目,返回 True。
Hide(self, item, recursive)
这是 Show (item, False, recursive)
的一个简便方法。
Layout(self)
这个方法会强制重新计算和布局由布局管理器控制的项目,使用当前分配给布局管理器的空间。通常这个方法会在拥有窗口的 EVT_SIZE 处理程序中自动调用,但当布局中的某个项目改变大小,或者添加或移除项目时,从用户代码中调用它也是很有用的。
参考资料: wxPython in Action, Noel Rappin 和 Robin Dunn