Tkinter.button(state=DISABLED) wirkt nicht

Fragen zu Tkinter.
Antworten
Nikolas
User
Beiträge: 102
Registriert: Dienstag 25. Dezember 2007, 22:53
Wohnort: Freiburg im Breisgau

Dienstag 1. Januar 2008, 23:19

Hallo Schlangenfreunde,

wenn ich bei meinem MineSweeper auf eine Bombe klicke, rufe ich für alle Button ein .config(state=tk.DISABLED) auf. Daraufhin werden auch alle Buttons fast durchsichtig. Nur reagieren die Button immer noch auf die Maus und ignorieren das DISABLED nur freundlich.

Code: Alles auswählen

button.bind("<Control Button-1>" ,
                             lambda event, x=j, y=i:self.master.cellKlickedRight(x,y))
mit solchen Ausdrücken belege ich die Button mit den passenden Methoden, nur werden die immer ausgeführt...

Könnte mir da vielleicht jemand weiterhelfen?
Erwarte das Beste und sei auf das Schlimmste vorbereitet.
BlackJack

Mittwoch 2. Januar 2008, 00:28

Das DISABLED bezieht sich nur auf das `command`-Argument.
Nikolas
User
Beiträge: 102
Registriert: Dienstag 25. Dezember 2007, 22:53
Wohnort: Freiburg im Breisgau

Mittwoch 2. Januar 2008, 00:52

Aha. Und warum? Wenn ich einen Button ausschalte, sollte doch gar nichts mehr mit ihm passieren. Muss ich dann ein unbind für jeden ausführen und später wieder hin, oder einen zusätzlichen boolean einsetzen, oder gibts da noch eine praktischere Variante?
Erwarte das Beste und sei auf das Schlimmste vorbereitet.
BlackJack

Mittwoch 2. Januar 2008, 10:15

Man benutzt normalerweise kein `bind()` für Buttons. Das `command`-Argument ist ja nicht einfach ein Ersatz für ein `bind()` der linken Maustaste, da steckt wesentlich mehr Logik dahinter. Zum Beispiel das übliche Verhalten von Buttons, dass man den linken Knopf runter drücken kann, und es sich noch einmal anders überlegen und mit gedrückter Maustaste den Button wieder verlassen kann, ohne dass `command` ausgeführt wird. Dazu kommt dann noch das Neuzeichnen des Buttons im gedrückten Zustand und halt auch die Auswertung des `state`.

Der Button selbst bindet also die linke Maustaste mit `bind()` an einen ganzen Haufen Code. Dein externes Binden der rechten Maustaste ist dagegen direkt, ohne Umwege, an Deinen Code gebunden.

Du kannst also nur den Button ausschalten, aber nicht das Widget.

Eine Unterklasse von `Button` die auch ein `right_command`-Argument kennt, die rechte Maustaste bindet und dort auch den `state` berücksichtigt wäre wohl die einfachste Lösung.
Antworten