Event Probleme ...

Fragen zu Tkinter.
Antworten
Janux
User
Beiträge: 78
Registriert: Donnerstag 12. Juni 2008, 21:11

Hallo!
Bitte sagt mir, wo ich den Denkfehler in diesem Programm habe.

Als Fehlermeldung nach <Return> kommt folgendes:
TypeError: naechsterFrame() takes exactly 1 argument (2 given)

Ich kann es mir nicht erklären, da es ja funktioniert, wenn ich den
Button drücke.

Code: Alles auswählen

import Tkinter as tk

class Klasse(object):
    def __init__(self):
        self.root = tk.Tk()
        self.frame = tk.Frame(self.root)
        self.label = tk.Label(self.frame, text='Erster Text')
        self.button = tk.Button(self.frame, text='Weiter',
                                command=Test().naechsterFrame)

        self.frame.pack()
        self.label.pack()
        self.button.pack()

        self.root.bind('<Return>', Test().naechsterFrame)

    def ready(self):
        self.root.mainloop()

class Test(object):
    def naechsterFrame(self):
        app.frame.forget()
        self.label = tk.Label(app.root, text='Zweiter Text')
        self.label.pack()

app = Klasse()
app.ready()

Was ich zu den Events auch noch nicht rausfinden konnte ist, wie man
einstellen kann, dass man sofort in ein Entry-Feld etwas eingeben kann,
ohne,dass man es erst aktivieren muss.
Außerdem würde ich gerne wissen, wie man Buttons mit <Return> drückt,
auf die man getabbt ist. Und wie stellt man die Tabulatorreihenfolge ein?

mfg Janux
BlackJack

Die Fehlermeldung ist doch recht deutlich: `naechsterFrame()` erwartet *ein* Argument, bekommt aber *zwei*. Das zusätzliche Argument ist das Event, das übergeben wird.

Der Entwurf ist übrigens ziemlich wirr. Ein `Text`-Exemplar, das man nur erstellen muss, um auf die Funktion zuzugreifen, die dann wiederum auf das `app` auf Modulebene zugreift!?

Gewöhn Dir solche globalen Namen am besten gar nicht erst an. Das geht am einfachsten, wenn man auf Modulebene keinen Code hat, ausser Funktions-, Klassen- und Konstantendefinitionen und den Aufruf einer "Hauptfunktion".
Janux
User
Beiträge: 78
Registriert: Donnerstag 12. Juni 2008, 21:11

Danke für Deine Hinweise!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Janux hat geschrieben:Außerdem würde ich gerne wissen, wie man Buttons mit <Return> drückt, auf die man getabbt ist.
Im Prinzip hast du den richtigen Ansatz dafür schon angewendet: Du musst zusätzlich zur command-Option des Buttons noch ein entsprechendes Event an den Button binden. Was dabei falsch gelaufen ist, hat BlackJack beschrieben.

Wenn du damit leben könntest, statt der <Return>-Taste die Leertaste zu verwenden, dann könntest du dir das sparen - das funktioniert nämlich automatisch.

Das mit der Tabulatorreihenfolge ist so eine Sache. Grundsätzlich gilt, dass die Tabulaturreihenfolge der Reihenfolge beim Aufbau der GUI entspricht. Daran kann man dann manuell basteln, indem man für einzelne Widgets festlegt, ob sie überhaupt den Focus haben können bzw. diesen zu einem bestimmten Zeitpunkt für ein bestimmtes Widget erzwingt.
Janux
User
Beiträge: 78
Registriert: Donnerstag 12. Juni 2008, 21:11

numerix hat geschrieben: Wenn du damit leben könntest, statt der <Return>-Taste die Leertaste zu verwenden, dann könntest du dir das sparen - das funktioniert nämlich automatisch.
Also bei mir funktioniert das leider nicht automatisch.

siehe...

Code: Alles auswählen

import Tkinter as tk

root = tk.Tk()
def setLabel():
    label = tk.Label(root, text='Hallo Welt')
    label.pack()
button = tk.Button(root, text='Weiter', command=setLabel)
button.pack()

root.mainloop()
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Natürlich geht es so nicht, weil der Button nicht den Focus hat.

Du musst hinter button.pack() noch einfügen:

Code: Alles auswählen

button.focus_set()
Dann geht es ...
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Janus

Kannst du das folgende ausprobieren:

Code: Alles auswählen

import Tkinter as tk

root = tk.Tk()
def set_label(event=None):
    label = tk.Label(root, text='Hallo Welt')
    label.pack()
button = tk.Button(root, text='Weiter', command=set_label)
button.pack()
button.bind("<Return>", set_label)
button.focus_set()

root.mainloop()
Sollte jetzt mit der Enter- und Space-Taste funktionieren.
Mit der Enter-Taste wird zwar die Schaltfläche nicht animiert.

Gruss wuf :wink:
Take it easy Mates!
Janux
User
Beiträge: 78
Registriert: Donnerstag 12. Juni 2008, 21:11

Ok. Danke!
Antworten