Keybindings und Standartbindings

Fragen zu Tkinter.
Antworten
ippurk
User
Beiträge: 61
Registriert: Mittwoch 8. Juli 2009, 20:40

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..
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())
ippurk
User
Beiträge: 61
Registriert: Mittwoch 8. Juli 2009, 20:40

Alles klaro, vielen Dank
ippurk
User
Beiträge: 61
Registriert: Mittwoch 8. Juli 2009, 20:40

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
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
ippurk
User
Beiträge: 61
Registriert: Mittwoch 8. Juli 2009, 20:40

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.
Antworten