在wxPython中刷新面板内容

2 投票
2 回答
1678 浏览
提问于 2025-04-17 04:14

在wxPanel中,如何根据同一面板上其他控件的事件来更新小部件呢?

场景1是根据另一个下拉框中选择的内容来更新一个下拉框的列表,这两个下拉框都在同一个面板里。

场景2是根据某个事件在面板上显示一个新的控件或小部件。

其实创建新的控件很简单,但我不知道怎么刷新或更新我的面板,让它立刻显示出来。

2 个回答

0

对于第一种情况,你可以这样做(假设第一个下拉框已经绑定了它的事件):

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

场景 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

通常你会把你的控件放在布局管理器里面。要隐藏或显示布局管理器中的元素,你可以调用 ShowHideLayout 方法:

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

撰写回答