Всем привет.
Есть код:
# -*- coding: cp1251 -*-
import wx

class Panel(wx.Panel):
def __init__(self, parent, *args, **kwargs):
wx.Panel.__init__(self, parent, *args, **kwargs)
sizer = wx.BoxSizer(wx.VERTICAL)
self.dat = wx.DatePickerCtrl(self, style=wx.DP_DROPDOWN)
sizer.Add(self.dat)
self.SetSizer(sizer)
wx.EVT_DATE_CHANGED(self.dat, self.dat.GetId(), self.DateChanged)
def DateChanged(self, evt):
wx.MessageBox('message text', 'message caption', wx.ICON_ERROR|wx.OK, self)
class MainFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent)
self.panel = Panel(self)

class App(wx.App):
def __init__(self):
wx.App.__init__(self)
# wx.App.__init__(self, True, 'log.txt')
frame = MainFrame(None)
frame.Show(True)

if __name__ == "__main__":
app = App()
app.MainLoop()
При попытке изменить дату, выпадает календарь на текущий месяц. В левом и правом уголках этого календаря есть кнопки для прокрутки месяца – месяц назад и месяц вперед соответственно. Но это все стандартно. Так вот, при клике по одной из этих кнопок, событие изменения даты обрабатывается в методе DateChanged и , собственно, в нем вызов MessageBox. Вроде все нормально, никакиз аномалий. Но..когда сообщение закрываешь, нажатая кнопка на каледаре “западает” – месяца начинают переключаться беспрерывно и, также беспрерывно, начинают появляться новые сообщения. Переписал код так:
# -*- coding: cp1251 -*-

import wx

class Panel(wx.Panel):
def __init__(self, parent, *args, **kwargs):
wx.Panel.__init__(self, parent, *args, **kwargs)
sizer = wx.BoxSizer(wx.VERTICAL)
self.dat = wx.DatePickerCtrl(self, style=wx.DP_DROPDOWN)
sizer.Add(self.dat)
self.SetSizer(sizer)
wx.EVT_DATE_CHANGED(self.dat, self.dat.GetId(), self.DateChanged)
def show_mes(self, text):
wx.MessageBox(text,'message caption', wx.ICON_ERROR|wx.OK, self)
def DateChanged(self, evt):
wx.CallAfter(self.show_mes, 'message text')
class MainFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent)
self.panel = Panel(self)

class App(wx.App):
def __init__(self):
wx.App.__init__(self)
# wx.App.__init__(self, True, 'log.txt')
frame = MainFrame(None)
frame.Show(True)

if __name__ == "__main__":
app = App()
app.MainLoop()
проблема решилась. Но все таки осталось непонятным, почему вообще появилась такая проблема “зацикливания” события? Проблема в кривых руках или MessageBox извращенным способом играется с какими-то событиями? Кто-нибудь может все по полочкам разложить?

З.Ы. Думал как это лучше объяснить, надеюсь получилось понятно :)