Hallo allerseits,
Widgets in einem Fenster zu programmieren war bisher kein Problem unter "root".
Also etwa so für 4 Spinboxen:
s0=IntVar(); s0.set(0):
s1=IntVar(); s1.set(1):
s2=IntVar(); s2.set(2):
s3=IntVar(); s3.set(3):
sn = [s0, s1, s2, s3}
for n in range(4):
spin = Spinbox(root, bd=5, width=3, from_=0, to=255, textvariable=sn[0])
spin.place(x=n*70, y=100)
Es werden also 4 Spinboxen nebeneinander erzeugt.
Sie werden nacheinander mit den Werten 1 - 4 geladen.
Über die Textvariable "sn[0]" oder "s0" kann man jederzeit beispielsweise in der
Spinbox 1 den Wert auf 100 setzen, der dann natürlich in der Spinbox ausgegeben wird.
sn[0].set(100)
--------------------------------------------------------------------------------------------------------------------------------------------
Nun habe ich ein zweites Fenster geöffnet unter "root_neu".
In diesem neuen Fenster habe ich nun auch wieder Spinboxen erstellt.
sNeu0=IntVar(); sNeu0.set(0):
sNeu1=IntVar(); sNeu1.set(1):
sNeu2=IntVar(); sNeu2.set(2):
sNeu3=IntVar(); sNeu3.set(3):
sNeu = [sNeu0, sNeu1, sNeu2, sNeu3}
for n in range(4):
spinNeu = Spinbox(root, bd=5, width=3, from_=0, to=255, textvariable=sNeu[0])
spinNeu.place(x=n*70, y=100)
In diesem neuen Fenster funktioniert der set-Mechanismus leider nicht.
D.h., ein Wert wird zwar in der Variablen gespeichert, aber in der Spinbox nicht ausgegeben:
sNeu[0].set(100)
Mit dem Befehl
lies = sNeu[0].get()
kann man sehr wohl den Spinwert auslesen und etwa mit "Message" anzeigen lassen.
Jetzt das merkwürdige: Man kann aus dem neuen Fenster heraus aber Werte in den
Spinboxen des Hauptfensters verändern, die auch ausgegeben werden.
Der Befehl in Fenster "root_neu" beispielsweise
sn[0].set(100)
setzt im Hauptfenster die erste Spinbox auf den Wert 100.
Das Widget "Spinbox" kennt keinen Optionswert "set", weshalb man also nicht
schreiben kann:
spinNeu.set(100)
Man muß einen anderen Weg gehen mit:
spinNeu.insert(0, 100)
Dies ist jedoch "ätzend", da ein "insert"-Befehl länger dauert als ein "set"-Befehl.
Ferner muß man nun jeder Befehlszeile einen Index verpassen:
spinNeu = [0, 0, 0, 0]
for n in range(4):
spinNeu[n] = Spinbox(root, bd=5, width=3, from_=0, to=255, textvariable=sNeu[0])
spinNeu[n].place(x=n*70, y=100)
Wer kann mir helfen? Woran liegt das?
Gruß, Theodor
Bei Widgets in einem neuen Fenster funktionieren die Optionen nicht alle.
Du könntest in deinem Code viel vereinfachen durch die Nutzung von schleifen, und Funktionen. Und er würde von Guten Namen profitieren. Dann fällt einem nämlich auf, wenn man durch copy und Paste das alte Root benutzt. Statt das neue.
Das verstehe ich nicht. Ich habe konkret die Frage, warum man Mechanismen in einem Hauptfenster so nutzen kann, wie in den Dokumentationen aufgeführt, aber nicht in neuen Fenstern, die aus dem Hauptfenster aufgerufen werden. Es geht hauptsächlich um die Nutzung von "textvariable" und "variable".
Theodor
Theodor
Nochmal: du hast dich erfolgreich selbst verwirrt durch die Nutzung von schlechten Namen. Es gibt keinen Unterschied zwischen den Variablen in Haupt- oder Unterfenstern, wie du es vermutest. Was aber nicht geht ist dieselbe Variable in mehreren Widgets zu nutzen.
@__deets__ copy und paste wäre schön fürs Forum, der Code strotzt leider vor Syntax-Fehlern (und anderen), die offenbar durch Abtippen statt Reinkopieren entstanden sind. Deshalb ist es schwer, zu beurteilen, wo der Fehler wirklich liegt. Aber vermutlich ist es schon root vs. root_neu.
- __blackjack__
- User
- Beiträge: 14052
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Oder es sind zwei `Tk`-Objekte statt ein `Tk`- und ein `Toplevel`-Objekt. Aber auch das kann man halt auch nur raten wenn man den Code nicht gezeigt bekommt.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari