ich habe ein Probem mit EVT_SET_FOCUS. Arbeite unter Windows XP SP3, Python 2.6.2, wx-2.8-msw-unicod.
Das Problem:
Bei einer ComboBox binde ich an EVT_SET_FOCUS und EVT_KILL_FOCUS die entsprechenden Methoden onFocusSet und onFocusLost. Wenn ich die ComboBox mit der TAB-Taste 'betrete', wird nicht wie erwartet die Methode onFocusSet aufgerufen, sondern die Sequenz onFocusSet - onFocusLost - onFocusSet. Bei Mausklick in die ComboBox gibt es - wie erwartet - nur ein onFocusSet. Scheint ein auf die ComboBox beschränktes Phänomen zu sein, ein TextCtrl zeigt das nicht. Da wird sowohl bei Mausklick als auch bei TAB nur die onFocusSet-Methode aufgerufen.
Folgender Programmausschnitt reproduziert das Verhalten:
Code: Alles auswählen
import wx
class cMainFrame(wx.Frame):
def __init__(self, parent, id, label):
wx.Frame.__init__(self, parent, id, label)
panel = wx.Panel(self, id)
#----------------------------------------------------
self.comboBox = wx.ComboBox(panel, -1, value='wx.ComboBox', choices=[ 'wx.ComboBox','zwei','drei'])
self.comboBox.SetSelection(0)
wx.EVT_SET_FOCUS (self.comboBox, self.onFocusSet_combo)
wx.EVT_KILL_FOCUS(self.comboBox, self.onFocusLost_combo)
#----------------------------------------------------
self.textCtrl = wx.TextCtrl(panel, -1, 'wx.TextCtrl')
wx.EVT_SET_FOCUS (self.textCtrl, self.onFocusSet_text)
wx.EVT_KILL_FOCUS(self.textCtrl, self.onFocusLost_text)
#----------------------------------------------------
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(self.textCtrl, 0, wx.ALL, 1)
sizer.Add(self.comboBox, 0, wx.ALL, 1)
panel.SetSizer(sizer)
panel.Layout()
def onFocusSet_combo(self, event):
print 'onFocusSet_MyCombo()'
event.Skip()
def onFocusLost_combo(self, event):
print 'onFocusLost_myCombo()'
event.Skip()
def onFocusSet_text(self, event):
print '********************* onFocusSet_TextCtrl'
event.Skip()
def onFocusLost_text(self, event):
print '********************* onFocusLost_TextCtrl'
event.Skip()
myApp = wx.PySimpleApp(0)
myFrame = cMainFrame(None, -1, 'Test')
myApp.SetTopWindow(myFrame)
myFrame.Show()
myApp.MainLoop()
Grüße und Danke
Humbalan