Bindung mit Tastatur gibt einen Fehler

Fragen zu Tkinter.
Antworten
Maschinenhans
User
Beiträge: 20
Registriert: Donnerstag 14. Juli 2011, 12:23

Hallo,

ich habe das Problem, das mir die folgende Fehlermeldung ausgegeben wird:
Traceback (most recent call last):
File "/usr/lib64/python3.3/tkinter/__init__.py", line 1475, in __call__
return self.func(*args)
TypeError: keys() takes 1 positional argument but 2 were given
Zur Verdeutlichung des Problems habe ich ein Minimalbeispiel gemacht:

Code: Alles auswählen

#!/usr/bin/env python3

import tkinter as tk


class Form():
    def __init__(self,master=None):
        lbl_taste = tk.Label(text='Platzhalter')
        lbl_taste.pack(fill='both', padx=10, pady=10, expand=True)


    def keys(self, event):
        print(event.keysym)



def main():
    app = tk.Tk()
    app.geometry('480x320')
    app.bind('<Key>', app.keys)
    form = Form()
    app.mainloop()



if __name__ == '__main__':
    main()
Das Problem tritt auf, wenn man im Fenster eine Taste drueckt und eine Aktion ausgeloest werden soll.
Ich habe keine Ahnung, woher die 2 Argumente aus der Fehlermeldung kommen.

Kann mir vielleicht jemand das Problem in einfachen Worten erklaeren? Ich moechte das gerne verstehen.

Vielen Dank fuer eure Muehe und mit freundlichem Grusse
vom Maschinenhans
Alles wird gut.
BlackJack

@Maschinenhans: Das eine Argument ist das `self` und das andere Argument ist das Ereignisobjekt. Und die `Tk.keys()`-Methode kann nichts mit dem Ereignisobjekt anfangen. Die macht etwas gänzlich anderes als die `Form.keys()`-Methode die Du da eigentlich übergeben solltest. ;-)

Edit: Und man sollte bei Widgets immer ein Elternobjekt übergeben, damit man sicher sein kann in welchem Container-Widget das angezeigt werden wird.
Maschinenhans
User
Beiträge: 20
Registriert: Donnerstag 14. Juli 2011, 12:23

Hallo Blackjack,

erstmal vielen Dank fuer die schnelle Antwort. Dank deiner Hilfe funktioniert es.
BlackJack hat geschrieben:@Maschinenhans: Das eine Argument ist das `self` und das andere Argument ist das Ereignisobjekt.
Ok. Das verstehe ich gut. Nach dem Fehlerbeheben macht es auch Sinn fuer mich.
BlackJack hat geschrieben:Und die `Tk.keys()`-Methode kann nichts mit dem Ereignisobjekt anfangen. Die macht etwas gänzlich anderes als die `Form.keys()`-Methode die Du da eigentlich übergeben solltest. ;-)
Du siehst mich betreten zu Boden schauen und unsicher, leise Kichern :oops: . Diesen Fehler haette ich selber finden koennen. Ich hab' den Wald vor Baeumen nicht gesehen.
BlackJack hat geschrieben:Edit: Und man sollte bei Widgets immer ein Elternobjekt übergeben, damit man sicher sein kann in welchem Container-Widget das angezeigt werden wird.
Richtig. Das macht auf jeden Fall Sinn.

Der Form halber habe ich noch eine funktionierende Version angehaengt. Evtl. hilft es ja noch anderen.

Code: Alles auswählen

#!/usr/bin/env python3

import tkinter as tk


class Form():
    def __init__(self, master):
        lbl_taste = tk.Label(master, text='Platzhalter')
        lbl_taste.pack()


    def key_stroke(self, event):
        print(event.keysym)



def main():
    app = tk.Tk()
    form = Form(app)

    app.geometry('480x320')
    app.bind('<Key>', form.key_stroke)
    app.mainloop()



    
if __name__ == '__main__':
    main()
Mit freundlichen Gruessen vom Maschinenhans

P. S. Es macht grossen Spass hier Fragen zu stellen. Es wird schnell und kompetent geholfen. Danke!
Alles wird gut.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Maschinenhans: Übrigens haben die Klammern bei

Code: Alles auswählen

class Form():
    ...
keinerlei Funktion, wenn nichts zwischen ihnen steht. Lass sie weg:

Code: Alles auswählen

class Form:
    ...
In specifications, Murphy's Law supersedes Ohm's.
Antworten