我在wxPython中有一个大型GUI应用程序。每当我点击按钮时,MessageDialog
都会显示一些结果。在对话框中单击“确定”和“X”时,对话框将消失,但会再次触发原始按钮的事件。因此,对话框第二次显示,因此它会无限延续。
我的代码(最小化到相关部分):
import wx
from wx import MessageDialog
class Compiler():
@staticmethod
def compile(code):
dialog = MessageDialog(None, code+'\n\n', caption='Compiler result', style=wx.ICON_ERROR|wx.CENTRE)
dialog.ShowModal()
class GUI ( wx.Frame ):
def __init__( self):
wx.Frame.__init__ ( self, None, id = wx.ID_ANY, title = "Test frame", pos = wx.DefaultPosition, size = wx.Size(200, 300), style = wx.CAPTION|wx.CLOSE_BOX|wx.MINIMIZE_BOX|wx.TAB_TRAVERSAL )
theSizer = wx.GridBagSizer( 0, 0 )
self.theButton = wx.Button( self, wx.ID_ANY, "Hit me!", wx.DefaultPosition, wx.DefaultSize, 0 )
theSizer.Add( self.theButton, wx.GBPosition( 0, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 )
self.SetSizer( theSizer )
self.Layout()
self.Centre( wx.BOTH )
self.theButton.Bind( wx.EVT_LEFT_DOWN, self.execute )
def execute( self, event ):
event.Skip()
print 'Button executed!'
Compiler.compile('any_input');
if __name__ == '__main__':
app = wx.App(False)
GUI().Show() # Launch GUI
app.MainLoop()
按下按钮一次后,单击框架中的任何位置将导致事件再次触发,为什么会发生这种情况?
答案 0 :(得分:2)
代码中的真正错误:
def execute( self, event ):
event.Skip()
print 'Button executed!'
Compiler.compile('any_input');
是event.Skip()
。它的作用是不断传播事件。因此,事件在没有任何其他事件处理程序的情况下继续传播,并由循环中的此事件处理程序连续处理和传播。删除该行,它工作正常!
请查看此documentation以获取更多信息