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

时间:2010-04-21 17:59:30

标签: python events wxpython

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

下面的代码演示了我遇到的问题。我正在创建一个wx.ComboBox并试图通过发布一个wxEVT_COMMAND_COMBOBOX_SELECTED事件来模拟它的功能以进行测试...这个事件奇怪地适用于wx.Choice,但它对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()

更新:我将组合框连接到wx.EVT_COMBOBOX的处理程序,以查看在那里捕获了什么事件类型,并且我得到了与wxEVT_COMMAND_COMBOBOX_SELECTED匹配的ID 10016 ...因此生成此命令事件肯定应该导致ComboBox更新。

2 个答案:

答案 0 :(得分:1)

这似乎是来自OSX的特定错误。 两种选择在windowsXP中都很完美。

答案 1 :(得分:0)

我认为这解决了这个问题,或者至少指出了更完整修复的方法。

编辑:如果您愿意,可以使用PyCommandEvent,如果需要,可以使用SetInt和SetString在Event中添加更多信息。但据我所知,有必要设置组合框的选择。

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()