如何通过发送事件设置wx.combobox的值

2 投票
2 回答
5984 浏览
提问于 2025-04-15 21:53

注意:这个问题似乎是特定于OSX的。

下面的代码展示了我遇到的问题。我正在创建一个wx.ComboBox,并试图通过发送一个wxEVT_COMMAND_COMBOBOX_SELECTED事件来模拟它的功能,以便进行测试……这个事件在wx.Choice上工作得很好,但对ComboBox却没有任何作用。

看起来没有其他事件可以发送给ComboBox,但也许我漏掉了什么。

我在Mac OSX 10.5.8上运行这个代码,使用的是Python 2.5。

import wx

app = wx.PySimpleApp()

def on_btn(evt):
   event = wx.CommandEvent(wx.wxEVT_COMMAND_COMBOBOX_SELECTED,combobox.Id)
   event.SetEventObject(combobox)
   event.SetInt(1)
   event.SetString('bar')
   combobox.Command(event)
   app.ProcessPendingEvents()


frame = wx.Frame(None)
panel = wx.Panel(frame, -1)
# This doesn't work
combobox = wx.ComboBox(panel, -1, choices=['foo','bar'])
# This works
#combobox = wx.Choice(panel, -1, choices=['foo','bar'])
combobox.SetSelection(0)
btn = wx.Button(panel, -1, 'asdf')
btn.Bind(wx.EVT_BUTTON, on_btn)
sz = wx.BoxSizer()
sz.Add(combobox)
sz.Add(btn)
panel.SetSizer(sz)
frame.Show()

app.MainLoop()

更新:我把ComboBox连接到了wx.EVT_COMBOBOX的处理程序,看看那里捕获到了什么事件类型,结果得到了id 10016,这和wxEVT_COMMAND_COMBOBOX_SELECTED是匹配的……所以生成这个命令事件肯定应该让ComboBox更新。

2 个回答

0

我觉得这个方法可以解决问题,或者至少能指引我们找到更完整的解决方案。

补充一下:如果你愿意的话,可以使用PyCommandEvent,同时也可以用SetInt和SetString来在事件中放入更多信息。不过,按照我所理解的,设置下拉框的选择也是很重要的。

import wx

app = wx.PySimpleApp()

def on_btn(evt):
    combobox.Selection=1
    wx.PostEvent(combobox, wx.CommandEvent(wx.wxEVT_COMMAND_COMBOBOX_SELECTED)) 
    print "foo"

def on_select(evt):
    print "selected", combobox.Selection

frame = wx.Frame(None)
panel = wx.Panel(frame, -1)
# This doesn't work
combobox = wx.ComboBox(panel, -1, choices=['foo','bar'])
# This works
# combobox = wx.Choice(panel, -1, choices=['foo','bar'])
combobox.SetSelection(0)
btn = wx.Button(panel, -1, 'asdf')
btn.Bind(wx.EVT_BUTTON, on_btn)
combobox.Bind(wx.EVT_COMBOBOX, on_select)
sz = wx.BoxSizer()
sz.Add(combobox)
sz.Add(btn)
panel.SetSizer(sz)
frame.Show()

app.MainLoop()
1

这看起来是OSX系统的一个特定错误。在Windows XP上,这两种方法都能正常工作。

撰写回答