Trace oder mit command mehrere widgets auf einmal ändern?

Fragen zu Tkinter.
Antworten
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Folgendes Problem: ich habe 2 Radiobuttons. Je nach dem welcher ausgewählt ist, sollen Eingabefenster deaktiviert oder aktiviert werden.

Mit dem command funktioniert das ja, dass wenn ich einen Radiobutto clicke, ich ein Entry aktivieren oder disablen kann.

Mein Problem: Wie bekomme ich mehrere Entrys auf einmal geändert?
Wenn man es sich anders überlegt, muss der aktivierte Entry ja wieder deaktiviert werden.

BlackJack hat mich dann auf die Idee mit dem trace gebracht. Jetzt müsste ja meine callbackfunktion dann eigentlich aufgerufen werden, sobald ich einen Radiobutton auswähle, oder die Auswahl ändere, oder?

Irgendwie krieg ich das gerade aber net so richtig hin.

Hier der code Ausschnitt:

Code: Alles auswählen

def change_indikator():
    global indikator,indi_entry, calc_cat_entry,kat
    if indikator.get() == "ID":
        indi_entry.config(state = NORMAL)
        calc_cat_entry.config(state = DISABLED)
        kat.config(state = DISABLED)
    elif indikator.get() =="category":
        indi_entry.config(state = DISABLED)
        calc_cat_entry.config(state = NORMAL)
        kat.config(state = NORMAL)

def BerechneIndikatoren():
    global root, pw_db,indikator, ebene, calc_cat_entry, indi_entry, kat,land_entry
    root = Tk()
    # ...
    indikator = StringVar()
    indikator.trace("w",change_indikator())
    
    indi_entry = Entry(root,width = 0, state = DISABLED)
    calc_cat_entry = Entry(root,width = 0,state = DISABLED)
    kat = Entry(root, width = 0,state = DISABLED)
    
    category = Radiobutton(root,
        anchor = "w",
        bg = "#ffffc1", font = "Verdana 10 bold", 
        text = u"Auswahl \u00FCber Kategorie (calc_cat oder kat)",
        variable = indikator,
        value = "category")
    ID= Radiobutton(root,
        anchor = "w", 
        bg = "#ffffc1", font = "Verdana 10 bold",
        text = u"Auswahl \u00FCber ID",
        variable = indikator,
        value = "ID")
EDIT: ich bekomme noch eine TypeError: 'NoneType' object is not callable
, den ich gerade nicht zuordnen kann. indikator ist doch ein StringVar().

Muss bei den Radiobuttons noch ein command rein? Dachte das kann ich weglassen, weil das Trace ja eine Zustandsändeurng mitbekommen müsste.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Den Error bekommst du, weil du in l. 18 None als Funktion übergibst, da du "change_indicator" aufrufst. Es wird also der Rückgabewert übergeben, und dieser ist None.
Und du solltest versuchen, ohne global auszukommen!
Und ohne Sternchenimporte!
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

ah ... Danke ...

So geht es jetzt:

Code: Alles auswählen

def change_indikator(name, index, mode):
    ...


indikator = StringVar()
indikator.trace("w",change_indikator)

Stell gerade fest ich brauch da nicht mal die globals ... :) kann ich einfach weglassen ;-)

Normalerweise verwende ich auch keine globals, auch nur wenn ich mit Tkinter arbeite und muss gestehen, dass ich mich damit noch net allzu gut auskenne. Wie komm ich denn da um die globals drumherum? Stand halt im Tutorial und in Beispielen so drin ;-)

Sternchen-Import sind böse, ja ich weiß. Nachdem ich dann schon die Üebrsicht selber verloren hatte, bei Import meiner eigenen Module, bin ich auch ganz schnell wieder davon abgekommen. Im Vorliegenden Beispiel hab ich auch nur Tkinter mit * importiert, den Rest ganz brav :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

meneliel hat geschrieben:Normalerweise verwende ich auch keine globals, auch nur wenn ich mit Tkinter arbeite und muss gestehen, dass ich mich damit noch net allzu gut auskenne. Wie komm ich denn da um die globals drumherum? Stand halt im Tutorial und in Beispielen so drin ;-)
Mit Klassen/Instanzen.
meneliel hat geschrieben:Im Vorliegenden Beispiel hab ich auch nur Tkinter mit * importiert, den Rest ganz brav :)
Das importiert ja nur über 500 Namen, das ist ja fast gar nichts, ne? Das ist ja nur der Import, der am meisten Fehler produziert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Leonidas hat geschrieben:
meneliel hat geschrieben:Normalerweise verwende ich auch keine globals, auch nur wenn ich mit Tkinter arbeite und muss gestehen, dass ich mich damit noch net allzu gut auskenne. Wie komm ich denn da um die globals drumherum? Stand halt im Tutorial und in Beispielen so drin ;-)
Mit Klassen/Instanzen.
IRGGS .... :( komm ich wohl auf Dauer nicht drum rum mir das doch mal zu Gemüte zu führen.

Leonidas hat geschrieben:
meneliel hat geschrieben:Im Vorliegenden Beispiel hab ich auch nur Tkinter mit * importiert, den Rest ganz brav :)
Das importiert ja nur über 500 Namen, das ist ja fast gar nichts, ne? Das ist ja nur der Import, der am meisten Fehler produziert.
:( k..... dann .... *seufz* .... *garstiges Sternchen beseitigen gehe*
Holzdolph
User
Beiträge: 23
Registriert: Donnerstag 22. November 2007, 17:43

machst du einfach

Code: Alles auswählen

import Tkinter as Tk
und setzt vor jede Tkinter - funktion und konstante ein Tk.
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Holzdolph hat geschrieben:machst du einfach

Code: Alles auswählen

import Tkinter as Tk
und setzt vor jede Tkinter - funktion und konstante ein Tk.
meneliel hat geschrieben:...
:( k..... dann .... *seufz* .... *garstiges Sternchen beseitigen gehe*
Das ist doch schon ganz lange passiert. Wie ich den *-import wegbekomme, weiß ich doch ^^
Antworten