问题描述
众所周知,在代码中的wxpython设置中,组合框的值不会触发EVT_COMBOBox事件,而是当用户使用鼠标选择项目时触发该事件。因此,如果需要,您必须手动触发事件。
在我的程序中,在处理程序函数中,我需要使用方法event.GetSelection()返回的值,其中event是传递给处理程序函数的事件对象。
现在,问题在于,如果我在代码中设置了组合框的值,然后手动触发了EVT_COMBOBox事件,则event.GetSelection()方法不会返回与该事件引发相同的值用户用鼠标选择相同的项目。
您可以看到执行代码,当事件被代码触发时,event.GetSelection()方法始终返回值0(即组合框列表中的第一项,因此项“ a”在文本框中显示),而不是在代码中设置的显示值“ b”的值1。
为什么会这样?谢谢您的回答。
import wx
class ManualEventFrame(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self,id,'Manual Event Rising',size=(550,200))
self.panel = wx.Panel(self)
self.st=wx.StaticText(self.panel,label='Select an item',pos=(10,10))
self.cb=wx.ComboBox(self.panel,pos=(110,10),choices=['a','b','c'])
self.st2 = wx.StaticText(self.panel,label='You choosed item',75))
self.tc=wx.TextCtrl(self.panel,75))
self.button = wx.Button(self.panel,label="Select item 'b' and rise\nmanually the EVT_COMBOBox event",pos=(300,40))
self.button.Bind(wx.EVT_BUTTON,self.onButton)
self.cb.Bind(wx.EVT_COMBOBox,self.onSelect)
def onSelect(self,event):
self.tc.SetValue(self.cb.GetString(event.GetSelection()))
def onButton(self,event):
self.cb.SetSelection(1)
myevent = wx.CommandEvent(wx.EVT_COMBOBox._getEvtType(),self.cb.GetId())
myevent.SetEventObject(self.cb)
self.cb.GetEventHandler().ProcessEvent(myevent)
if __name__ == '__main__':
app = wx.App()
frame = ManualEventFrame(parent=None,id=-1)
frame.Show()
app.MainLoop()
解决方法
我不确定在这种情况下为什么event.GetSelection
会继续返回0
,但是可以解决您的问题的方法就是从“马口中”获得价值。 >
用途:self.tc.SetValue(self.cb.GetStringSelection())
或:self.tc.SetValue(self.cb.GetValue())