Seite 1 von 1

Keybindings und Standartbindings

Verfasst: Donnerstag 16. Juli 2009, 09:04
von ippurk
Hallo liebe Leute,

bei meinen kindlichen Erfahrungen mit Tkinter bekomme ich ein kleines Problemchen bezüglich folgender Situation:

Code: Alles auswählen

from Tkinter import tkinter

class App():
 
       
    def __init__ (self):
        self.hauptfenster = Tk()
        button = Button(self.hauptfenster, command=self.mousekey, text="Button")
        button.grid(row=0, column=0)
        self.hauptfenster.bind("<Return>", self.enterkey)
        self.hauptfenster.mainloop()

    def mousekey(self):
        print (self)
        print ("mousekey")

    def enterkey(self, irgendwatt):
        print (self)
        print (irgendwatt)
        print ("enterkey")

app = App()
Warum übergibt das für den Button voreingebaute Mouseclickbinding diese __main__.App Instanz und das selbstdefinierte Returnkeybinding zusätzlich dieses Tkinterevent. Muss ich tatsächlich in so einem Fall zwei verschiedene Methoden mit dem gleichen Inhalt schreiben oder macht man das mit *ignore, oder wie ?

Also, danke schon mal für die Antworten, bis dann..

Verfasst: Donnerstag 16. Juli 2009, 10:00
von BlackJack
@ippurk: Das sind ja zwei verschiedene Dinge. Bei `bind()` gibt es halt noch das Event-Objekt, in dem nähere Informationen über das auslösende Ereignis stecken können. Das ist eher "Low-Level". Während beim Button das betätigen des Buttons als Auslöser schon feststeht, und man eigentlich auch gar nicht mehr wissen will, als das der Button *irgendwie* aktiviert wurde. Deine Namensgebung ist da nämlich irreführend, denn der Button kann ja auch mit der Tab-Taste angesteuert und vielleicht mit der Leertaste aktiviert worden sein, statt mit der Maus.

Ich würde das ignorieren von Argumenten in der Methode, die letztendlich die Arbeit verrichtet vermeiden und das in eine ``lambda``-Funktion beim Binden des '<Return>' verschieben.

Code: Alles auswählen

        self.root('<Return>', lambda dummy: self.button_action())

Verfasst: Donnerstag 16. Juli 2009, 10:41
von ippurk
Alles klaro, vielen Dank

Verfasst: Donnerstag 16. Juli 2009, 11:54
von ippurk
uups, leider doch nix klaro:

Code: Alles auswählen


from Tkinter import tkinter


class App():
        
    def __init__ (self):
        self.hauptfenster = Tk()
        button = Button(self.hauptfenster, command=self.enterkey, text="Button")
        button.grid(row=0, column=0)

        ## Vorschlag von Blackjack:
        ## self.root('<Return>', lambda dummy: self.button_action())

        # meine Version
        self.hauptfenster('<Return>', lambda dummy: self.enterkey())

        hauptfenster.mainloop()

    def enterkey(self):
        print (self)
        print ("enter")


app = App()
behauptet bei mir leider:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\Stephan\Desktop\Pythonprogs\defcheck.py", line 24, in <module>
    app = App()
  File "C:\Dokumente und Einstellungen\Stephan\Desktop\Pythonprogs\defcheck.py", line 15, in __init__
    self.hauptfenster('<Return>', lambda dummy: self.enterkey())
AttributeError: Tk instance has no __call__ method

Verfasst: Donnerstag 16. Juli 2009, 12:19
von yipyip
Vielleicht wirds hiermit etwas klarer:

Code: Alles auswählen

import Tkinter as tk 

class App(object):
       

  def __init__(self):

    self.hauptfenster = tk.Tk()
    self.button = tk.Button(self.hauptfenster,
                            command=lambda : self.enterkey('per command'),
                            text="Button")
    self.button.grid(row=0, column=0)
    self.hauptfenster.bind('<Return>', lambda event: self.enterkey(event, 'per bind'))
    self.hauptfenster.mainloop()


  def enterkey(self, *args):
    print args


app = App() 
:wink:
yipyip

Verfasst: Freitag 17. Juli 2009, 14:48
von ippurk
ok, danke nochmal für die weiterführende Klarstellung, hab dann auch gemerkt, daß in dem Vorschlag von Blackjack das kleine Wörtchen bind fehlt und das dann natürlich einfach stumpf übernommen. Also, weiter geht's.