【发布时间】:2011-10-13 14:23:00
【问题描述】:
根据来自同一面板上其他控件的事件更新 wxPanel 中的小部件的方法是什么?
场景 1 正在根据从另一个组合框中选择的内容更新组合框的列表,其中两者都在同一个面板中。
场景 2 基于事件在面板中显示新控件/小部件。
基本上创建新控件很容易,但我不知道如何刷新/更新我的面板,所以立即显示它们。
【问题讨论】:
根据来自同一面板上其他控件的事件更新 wxPanel 中的小部件的方法是什么?
场景 1 正在根据从另一个组合框中选择的内容更新组合框的列表,其中两者都在同一个面板中。
场景 2 基于事件在面板中显示新控件/小部件。
基本上创建新控件很容易,但我不知道如何刷新/更新我的面板,所以立即显示它们。
【问题讨论】:
要更改组合框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)
组合框位于相同或不同面板中的事实与此无关。
通常,您将小部件放在 sizer 中。要在 sizer 上隐藏或显示元素,请调用 Show、Hide 或 Layout 方法:
Show(self, item, show=True, recursive=false)
显示或隐藏由 sizer 管理的项目。要使 sizer 项目消失或重新出现,请使用Show,后跟Layout。 item 参数可以是窗口、sizer 或项目的从零开始的索引。使用 recursive 参数显示或隐藏 subsizer 中的项目。如果找到该项目,则返回 True。
Hide(self, item, recursive)
Show (item, False, recursive) 的便捷方法。
Layout(self)
此方法将使用分配给sizer的当前空间强制对sizer控制的项目进行重新计算和布局。通常这会从拥有窗口的 EVT_SIZE 处理程序中自动调用,但是当 sizer 中的某个项目更改大小或添加或删除项目时,从用户代码中调用它也很有用。
参考文献: wxPython in Action,Noel Rappin 和 Robin Dunn
【讨论】:
对于场景一,您需要执行以下操作(假设第一个组合框绑定到其 EVT_COMBOBOX:
value = self.cboOne.GetValue()
if value == "something":
self.cboTwo.SetItems(someList)
为了显示一个新的小部件,您可以创建它,然后根据需要使用 Show()/Hide()。如果小部件在 sizer 中,则使用 Sizer 的 Append 或 Insert 方法。它还有一个 Detach 方法,可用于隐藏小部件,或者您只需调用 Hide 本身。有关详细信息,请参阅文档:http://www.wxpython.org/docs/api/wx.Sizer-class.html
【讨论】: