Seite 1 von 1

Event Probleme ...

Verfasst: Sonntag 7. September 2008, 18:06
von Janux
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

Verfasst: Sonntag 7. September 2008, 18:40
von 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".

Verfasst: Sonntag 7. September 2008, 19:20
von Janux
Danke für Deine Hinweise!

Re: Event Probleme ...

Verfasst: Sonntag 7. September 2008, 20:26
von numerix
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.

Re: Event Probleme ...

Verfasst: Sonntag 14. September 2008, 16:26
von Janux
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()

Verfasst: Sonntag 14. September 2008, 17:49
von numerix
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 ...

Verfasst: Sonntag 14. September 2008, 18:00
von wuf
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:

Verfasst: Sonntag 14. September 2008, 21:23
von Janux
Ok. Danke!