Wxpython wx.ListCtrl:告诉用户从程序的a_ListCtrl.Select()单击

Wxpython wx.ListCtrl:告诉用户从程序的a_ListCtrl.Select()单击,wxpython,Wxpython,第一个问题是这样的 当用户单击ListCtrl小部件时,它会生成一个EVT\u列表\u项目\u选定事件。 但是,如果我想在显示给用户之前设置列表,以便通过调用ListCtrl上的Select已高亮显示多个项目,则小部件将生成相同的事件。此事件是我的应用程序错误处理的事件,就像它是真实的用户选择一样 由于wxPython使用消息传递,我不能在进行编程选择之前简单地设置一个标志ignore_selection_events,然后清除它。很可能,在调用第一个EVT_列表_项_所选处理程序/回调之前,该

第一个问题是这样的

当用户单击ListCtrl小部件时,它会生成一个EVT\u列表\u项目\u选定事件。 但是,如果我想在显示给用户之前设置列表,以便通过调用ListCtrl上的Select已高亮显示多个项目,则小部件将生成相同的事件。此事件是我的应用程序错误处理的事件,就像它是真实的用户选择一样

由于wxPython使用消息传递,我不能在进行编程选择之前简单地设置一个标志ignore_selection_events,然后清除它。很可能,在调用第一个EVT_列表_项_所选处理程序/回调之前,该标志已被清除

我尝试过的一些解决方案以及出现的问题:

ListCtrl的一个成员允许关闭所选EVT_列表_项目的生成。我已经看过了,我确信这是不存在的

我可以使用wx.Timer在最后一次调用Select之后延迟一段时间取消设置ignore\u selection\u事件标志。准确的时间很容易出错。它的工作时间可能不会太短,或者可能会导致真正的用户选择丢失太长时间

应该可以使用PostEvent或ProcessEvent让ListCtrl在生成第一个选择的EVT_列表_项目之前生成一个特殊的ignore_selections事件,在生成最后一个选择的EVT_列表_项目之后生成另一个事件。我尝试了此操作,但未按我预期的顺序调用ignore事件消息的回调:

最后,我想到了暂时解除EVT_LIST_ITEM_SELECTED的事件处理程序的绑定。这可能会遇到与使用标志相同的问题。也就是说,在wxPython开始异步处理Select调用之前,处理程序将被替换,因此仍将调用处理程序。刚刚尝试了这个,它会导致gui立即挂起。我试着使用self.list\u ctl.Bindwx.EVT\u list\u ITEM\u SELECTED,除了使用一个without CallAfter之外什么都不做,在这两种情况下gui都会立即挂起

好的,交给你吧

更新:

谢谢杰夫!根据我的尝试提供更多信息

list_ctrl.SetItemState(item_index, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) #works
list_ctrl.SetItemState(item_index, 0xFFFFFFFF, wx.LIST_STATE_SELECTED) #works
list_ctrl.SetItemState(item_index, 1, wx.LIST_STATE_SELECTED) # does NOT work
因此,使用state和mask参数可以方便地修改项目状态,而无需先读取当前状态,或读取所需的修改位,然后再写回。

尝试设置项目状态。我在代码中使用以下命令取消选择项目:

self.ballotC.SetItemState(c, 0, wx.LIST_STATE_SELECTED) 
我会试试看

self.ballotC.SetItemState(c, 1, wx.LIST_STATE_SELECTED)


选择一个项目。有一些文档。它并不像可能的那么清晰,所以你必须玩一玩,直到你做对为止。

哦,天哪,我这边有个脑筋放屁。这仍然会生成EVT_LIST_ITEM_SELECTED消息并调用已注册的回调:正如@tullaman在这里指出的,SetItemState仍将调用EVT_LIST_ITEM_SELECTED事件。ListCtrl中是否有允许代码在不调用事件的情况下选择项目的内容?也许您可以进一步解释问题所在?如果将设置状态作为实际用户操作处理,为什么会出现问题?gui正在控制一个真实世界的设备—收音机。在启动时,我将gui的状态与无线电状态同步。因此,如果我检测到收音机选择了stationA,我想在GUI的电台列表中突出显示它。但我不想让收音机选择它已经选择的电台。我知道如果已经选择了电台,我可以通过签入onSelect回调来解决问题。但应该有一个更优雅的解决方案——达纳米特!
self.ballotC.SetItemState(c, 1, wx.LIST_STATE_SELECTED)
self.ballotC.SetItemState(c, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED)