wxPython 4.1.1版本下拉过滤框失效 同代码4.0.7版本运行正常
问题根因
你遇到的版本兼容问题是wxPython 4.1.1基于的wxWidgets底层调整了ComboBox的事件触发规则导致的:
- 4.0.7版本中,
SetValue()仅在输入框内容实际发生变更时才触发EVT_TEXT事件 - 4.1.1+版本中,
Set()(更新下拉选项)、SetValue()操作即使内容和当前值完全一致,也会额外触发EVT_TEXT事件
你原代码的忽略标记逻辑存在漏洞:设置ignoreEvtText=True后,本次修改触发的第一个EVT_TEXT事件就会把标记重置为False,后续的事件会正常执行、再次触发内容修改,最终进入死循环。
修复方案
调整忽略标记的重置时机,等本次主动修改触发的所有事件都处理完成后再重置标记即可,修改后的oncombo方法代码如下:
def oncombo(self, event): if self.ignoreEvtText: return textEntered = event.GetString() self.label.SetLabel(f"You selected {self.combo.GetValue()} from Combobox {textEntered}") if textEntered: matching = [s for s in self.languages if textEntered in s] self.ignoreEvtText = True self.combo.Set(matching) self.combo.SetValue(textEntered) self.combo.SetInsertionPoint(len(textEntered)) # 将标记重置操作放到事件队列末尾,过滤本次主动操作触发的所有事件 wx.CallLater(0, lambda: setattr(self, 'ignoreEvtText', False)) else: self.ignoreEvtText = True self.combo.Set(self.languages) wx.CallLater(0, lambda: setattr(self, 'ignoreEvtText', False)) self.combo.Popup()
修改后代码可在4.1.1版本正常运行,功能表现和4.0.7版本完全一致。
内容的提问来源于stack exchange,提问作者Sudarshan
相关产品推荐
相关产品推荐

