65. Events

Der Callback, den Buttons im command-Parameter nehmen, ist nur ein Spezialfall. Generell können Widgets fast beliebige Events verarbeiten. Mögliche Event-Typen sind u.a.:

  • ’<Button-1>’ – der erste Mausknopf wurde gedrückt.
  • ’<Double-Button-2>’ – der zweite Mausknopf wurde doppelgeklickt
  • ’<Enter>’ – der Mauszeiger ist in das Feld des Widgets geführt worden
  • ’<Key>’ – eine Taste wurde gedrückt
  • ’<Configure>’ – das Widget wurde umkonfiguriert

Die Strings oben können als erstes Argument im Aufruf der bind-Methode von Widgets dienen. Das zweite Argument ist der Callback, der wiederum als Argument ein Event-Objekt bekommt, in dem unter anderem der Event-Typ, das Widget, auf dem das Event ausgelöst wurde, die Mausposition und ggf. die gedrückte Taste steht.

Ein etwas albernes Beispiel für Eventverarbeitung: Ein Widget, in dem ein Quit-Knopf umherhüpft, sobald der Mauszeiger es erreicht und der durch Eingabe von “komm” unter den Mauszeiger gezwungen werden kann. Es ist nicht so, dass bei GUI-Programmen Leerzeilen unüblich wären, der Platz auf der Folie hat einfach nicht gereicht.

import Tkinter, random

class ButtonJump(Tkinter.Frame):
  def __init__(self, master, **kwargs):
    apply(Tkinter.Frame.__init__, (self, master),
      kwargs)
    self.bt = Tkinter.Button(self, text="Quit",
      command=self.quit)
    self.bt.bind('<Enter>', self.doJump)
    self.keyStrokes = []
    self.bind('<Key>', self.doKey)
    self.doJump(); self.focus()
  def doKey(self, event):
    self.keyStrokes.append(event.char)
    if len(self.keyStrokes)>4:
      del self.keyStrokes[0]
    if self.keyStrokes==['k','o','m','m']:
      self.bt.bind('<Enter>', lambda ev, s=self:
       s.bt.bind('<Enter>', s.doJump))
      self.bt.place_forget()
      self.bt.place(x=event.x, y=event.y,
        anchor=Tkinter.CENTER)
  def doJump(self, event=None):
    self.bt.place_forget()
    self.bt.place(relx=random.random(), rely=
    random.random(), anchor=Tkinter.CENTER)

root = Tkinter.Tk()
ButtonJump(root, width=300, height=300).pack(
  expand=1, fill=Tkinter.BOTH)
root.mainloop()


Markus Demleitner

Copyright Notice