Seite 1 von 1

Tkinter.button(state=DISABLED) wirkt nicht

Verfasst: Dienstag 1. Januar 2008, 23:19
von Nikolas
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?

Verfasst: Mittwoch 2. Januar 2008, 00:28
von BlackJack
Das DISABLED bezieht sich nur auf das `command`-Argument.

Verfasst: Mittwoch 2. Januar 2008, 00:52
von Nikolas
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?

Verfasst: Mittwoch 2. Januar 2008, 10:15
von BlackJack
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.