Button aktiv/inaktiv schalten

Fragen zu Tkinter.
Antworten
edst66
User
Beiträge: 2
Registriert: Dienstag 5. Juni 2007, 15:03

Dienstag 12. Juni 2007, 14:24

Hallo,

ich habe jetzt ein kleines Problem, nämlich ich möchte durch Drücken eines Buttons die anderen Button steuern, (inaktiv<->aktiv schalten)

ich habe folgende Code geschrieben, aber es funktioniert nicht.

Code: Alles auswählen

from Tkinter import *
class hello:
    def __init__(self):
        self.hf=Tk()
        self.make_widgets()
        self.hf.mainloop()
    
    def make_widgets(self):
        self.b1=Button(self.hf,state=NORMAL,text="hello")
        self.b1.pack()

        self.b2=Button(self.hf,state=DISABLED,text="hHHHHH")
        self.b2.pack()
        
        
        self.b3=Button(self.hf,state=DISABLED,text="abcde")
        self.b3.pack()
        
        self.weiter=Button(self.hf, text="WEITER",state=NORMAL,command=self.weiter)
        self.weiter.pack()

    def weiter(self):
        if self.b1.state==NORMAL:
            self.b2.state==NORMAL
	    self.b3.state==DISABLED

hello()
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Dienstag 12. Juni 2007, 18:27

Ich weiß jetzt nicht genau was du willst, aber du solltest statt b.state b["state"] schreiben, und wenn du nach der if-Bedingung in l. 24 noch einen Vergleich machst, dessen Ergebniss du nicht einmal verarbeitest, bringt das auch nix. Versuchs mal mit einem Gleichheitszeichen weniger.
Und was soll es bringen, den 3. Button, der von Anfang an inaktiv ist, bei jedem Aufruf der weiter-Methode nochmal zu deaktivieren?
Zum Schluss noch die Stadardsachen: import Tkinter as tk, unsinnige Leerzeilen vermeiden, und über die Auslagerung des Fensteraufbaus aus der __init__ in eine eigene Methode kann man vlt. streiten, aber ich find das auch unsinnig. :wink:
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Freitag 15. Juni 2007, 07:33

Hi edst66,

um meinen Vorredner noch zu ergänzen, wie hast Du Dir denn vorgestellt, die Buttons zu "steuern"?
edst66 hat geschrieben:

Code: Alles auswählen

    def weiter(self):
        if self.b1.state==NORMAL:
            self.b2.state==NORMAL
        self.b3.state==DISABLED
Vorausgesetzt Du folgst Schlangenbeschwörers Hinweisen bezüglich der Ressource 'state', dann bleibt beim ersten Aufruf dieser Methode b1 normal, b2 bleibt disabled (wenn Du ein '=' wegnimmst wird b2 auch normal), b3 ist und bleibt disabled. Und das war es dann auch, da kannst Du so oft auf weiter klicken, bis Dir der Finger abfällt. ;-) Selbst wenn sich der Zustand von b1 (vielleicht durch ein kippendes Bit?) irgendwann mal ändert, wird damit nur der Ausdruck falsch, aber deswegen wird b2 nicht mehr disabled.

Ich empfehle Dir daher als Steuerwidget einen Checkbutton mit indicatoron=False, der zeigt den Zustand immer an und Du kannst ihn sogar über eine Kontrollvariable abfragen oder diese wiederum direkt einbauen. Das sieht dann so aus:

Code: Alles auswählen

import Tkinter as TK
wTk = TK.Tk()

#   die Kontrollvariable speichert den Status
wControlVariable = TK.IntVar()
def print_state(wCV=wControlVariable):
    print "status der Integerkontrollvariable:", wCV.get()
wControlButton = TK.Checkbutton(wTk, text="weiter", command=print_state, variable=wControlVariable, indicatoron=False)
wControlButton.pack()

#   geht auch mit Strings
wControlVariableS = TK.StringVar()
wControlVariableS.set("normal")
def print_state(wCV=wControlVariableS):
    print "status der Stringkontrollvariable:", wCV.get()
wControlButtonS = TK.Checkbutton(wTk, textvariable=wControlVariableS, command=print_state, variable=wControlVariableS,
                                indicatoron=False, offvalue="normal", onvalue="disabled")
wControlButtonS.pack()

wTk.mainloop()
Und dann wäre da noch etwas...
edst66 hat geschrieben:

Code: Alles auswählen

        self.weiter=Button(self.hf, text="WEITER",state=NORMAL,command=self.weiter)
        self.weiter.pack()

    def weiter(self):
Dieser Abschnitt erscheint mir verwirrend, denn Du definierst in der Klasse sowohl einen Button namens 'weiter', aber auch eine Methode namens 'weiter'. Na viel Spaß beim raten.

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten