微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

wxpython-wx.EVT_COMBOBOX事件和GetSelection方法:手动与用户触发

如何解决wxpython-wx.EVT_COMBOBOX事件和GetSelection方法:手动与用户触发

众所周知,在代码中的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())

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。