Seite 1 von 1

Trace oder mit command mehrere widgets auf einmal ändern?

Verfasst: Sonntag 17. Februar 2008, 11:28
von meneliel
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.

Verfasst: Sonntag 17. Februar 2008, 12:03
von schlangenbeschwörer
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!

Verfasst: Sonntag 17. Februar 2008, 12:14
von meneliel
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 :)

Verfasst: Sonntag 17. Februar 2008, 13:32
von Leonidas
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.

Verfasst: Sonntag 17. Februar 2008, 14:03
von meneliel
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*

Verfasst: Donnerstag 28. Februar 2008, 10:39
von Holzdolph
machst du einfach

Code: Alles auswählen

import Tkinter as Tk
und setzt vor jede Tkinter - funktion und konstante ein Tk.

Verfasst: Donnerstag 28. Februar 2008, 12:44
von meneliel
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 ^^