Automatische erstellung von mehreren Buttons?

Fragen zu Tkinter.
Antworten
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

OK deets

Wie würdest du mein Code-Snippet abändern, dass es ohne StringVar das genau gleiche macht. Die Bezeichnung Observable ist neu für mich. Verstehe ich nicht. Danke für deine Bemühung.

Gruß wuf :wink:
Take it easy Mates!
deets

Code: Alles auswählen


from functools import partial
import Tkinter as tk

def button_callback(button_text):
    if button_text == 'c':
        buttons[0]["text"] = 'Button-2'

button_names = ['a','b','c']
buttons = list()

root = tk.Tk()

for button_name in button_names:
    button = tk.Button(root, text=button_name,
              command=partial(button_callback, button_name))
    button.pack(fill='x')
    buttons.append(button)

buttons[0]['text'] = 'Button-1'
    
root.mainloop()
Ein Observable ist ein Wert, der Nachrichten verschickt, wenn er veraendert wird. Das ist genau das, was eine StringVar und Co. sind.

Der Punkt den ich machen wollte: fuer deinen illustrierten Zweck kommt man ohne extra Komplexitaet aus. Aber natuerlich sind observables sehr hilfreich: wenn man zb ein Datenmodell hat, das sich durch irgendwas anderes aendert, und dadurch dann *automatisch* die GUI upgedated wird.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

@deets

Super! Besten Dank für deine hilfreiche Antwort mit Erklärung. Man hat eben nie ausgelernt. Dein modifizierte Code-Snippet verhält sich genau gleich wie mein aufgeblähtes Snippet.

Gruß :wink: Noch eine gute Nacht.
Take it easy Mates!
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

@deets

Ich hab meinen Fehler gefunden. Ich hatte bei mir in der callback funktion blöderweise die laufvariable, und nicht die übergebene ausgegeben, daher hab ich natürlich immer nur den letzten Wert ausgegeben. Funktioniert jetzt. Danke!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi deets

Habe doch noch einen kleinen Unterschied zwischen meinem und dem modifizierten Snippet festgestellt. Bei meine Snippet ist auch der Name eines modifizierten Button verfügbar. Aber aufbauend auf dem modifizierten Snippet ist dies auch ohne den Einsatz von StringVar() realisierbar. Hier noch eine Anpassung des modifizierten Snippet um dieses Verhalten zu erzielen:

Code: Alles auswählen

from functools import partial
import Tkinter as tk

def button_callback(button_obj):
    if button_obj['text'] == 'c':
        buttons[0]["text"] = 'Button-2'
    print button_obj['text']
    
button_names = ['a','b','c']
buttons = list()

root = tk.Tk()

for button_name in button_names:
    button = tk.Button(root, text=button_name)
    button.pack(fill='x')
    button.config(command=partial(button_callback, button))
    buttons.append(button)

buttons[0]['text'] = 'Button-1'
   
root.mainloop()
Gruß wuf :wink:
Take it easy Mates!
Antworten