Quellcode aus dem Video "An Introduction to Event-handling"
Original:
Code: Alles auswählen
import wx
ID_ABOUT = 101
ID_EXIT = 110
class MainWindow(wx.Frame):
def __init__(self,parent,id,title):
wx.Frame.__init__(self,parent,wx.ID_ANY,title,size = (400,200),
style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE )
self.control = wx.TextCtrl(self,1,style = wx.TE_MULTILINE)
self.CreateStatusBar()
#------ Setting up the menu.
filemenu = wx.Menu()
filemenu.Append(ID_ABOUT, "&About", "Information about this program")
filemenu.AppendSeparator()
filemenu.Append(ID_EXIT, "E&xit", "Terminate the program")
#------ Creating the menu.
menubar = wx.MenuBar()
menubar.Append(filemenu,"&File")
self.SetMenuBar(menubar)
#--- START NEW CODE: ------------------------------------------------------
#------ Setting menu event handlers
wx.EVT_MENU(self, ID_ABOUT, self.OnAbout )
wx.EVT_MENU(self, ID_EXIT, self.OnExit )
#--- END NEW CODE
self.Show(True)
#--- START EVENT HANDLERS ------------------------------------------------------
def OnAbout(self,event):
d = wx.MessageDialog( self, " A sample editor \n in wxPython "
,"About Sample Editor", wx.OK)
# Create a message dialog box
d.ShowModal() # Shows it
d.Destroy() # finally destroy it when finished.
def OnExit(self,event):
self.Close(True) # Close the frame.
#--- END EVENT HANDLERS ------------------------------------------------------
app = wx.PySimpleApp()
frame = MainWindow(None,-1,"Small Editor")
app.MainLoop()
Verändert:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import wx
class MainWindow(wx.Frame):
def __init__(self, parent = None, id = -1, title = "Small Editor"):
# Init
wx.Frame.__init__(
self, parent, id, title, size = (400,200),
style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE
)
# TextCtrl
self.control = wx.TextCtrl(self, -1, style = wx.TE_MULTILINE)
# StatusBar
self.CreateStatusBar()
# Filemenu
filemenu = wx.Menu()
# Filemenu - About
menuitem = filemenu.Append(-1, "&About", "Information about this program")
self.Bind(wx.EVT_MENU, self.OnAbout, menuitem) # Hier wird der Event-Handler angegeben
# Filemenu - Separator
filemenu.AppendSeparator()
# Filemenu - Exit
menuitem = filemenu.Append(-1, "E&xit", "Terminate the program")
self.Bind(wx.EVT_MENU, self.OnExit, menuitem) # Hier wird der Event-Handler angegeben
# Menubar
menubar = wx.MenuBar()
menubar.Append(filemenu,"&File")
self.SetMenuBar(menubar)
# Show
self.Show(True)
def OnAbout(self,event):
message = "A sample editor\n in wxPython"
caption = "About Sample Editor"
wx.MessageBox(message, caption, wx.OK)
def OnExit(self,event):
self.Close(True) # Close the frame.
app = wx.PySimpleApp()
frame = MainWindow()
app.MainLoop()
# Zerstören der Objekte, damit dieses Beispiel
# im IDLE nicht nur einmal funktioniert.
del frame
del app
Ich habe das veränderte Beispiel mit mehreren Kommentaren versehen, damit man besser erkennt, was wo passiert.
Die wichtigsten Änderungen zum Original:
1. Man kann Event-Handler mit der Methode **Bind()** an ein Objekt und ein dazugehöriges Event binden. Das hat den großen Vorteil, dass man sich nicht mehr mit irgendwelchen Event-IDs herumschlagen muss. Im Beispiel sind es ja nur zwei IDs, aber in einem ausgewachsenen Programm ist es ein Vielfaches. Die Events werden sofort nach dem Erstellen der Menüeinträge an die entsprechenden Event-Handler gebunden.
2. Statt wx.MessageDialog() verwendete ich wx.MessageBox(). Das erspart das umständlichere Handling des Dialogs. Allerdings ist man damit aber auch nicht mehr so flexibel. Aber darauf kann man meistens verzichten.
lg
Gerold
