Tkinter Button List/Dict: Selbst löschende Buttons
Verfasst: Freitag 6. Dezember 2019, 17:37
Liebes Python Forum!
Ich sitze nun seit einer Woche an diesem Problem, und bin langsam am verzweifeln. Ich stecke wohl einfach schon zu tief drinnen.
Folgendes Szenario:
Ich programmiere eine Database Software, und dafür gerade eine Entry Form. In dieser Entry Form gibt es einen Bereich, in dem man Worte aus einem Optionmenu auswählen kann.
Wenn ein Button ausgewählt wird, erstellt die callback function einen kleinen button darunter, mitsamt dem wort, welches dann auch zu einem array (liste, dict, etc) hinzugefügt wird. So weit so gut.
Die Buttons werden bei jeder aktion mit einer update function und einer for schleife neu erstellt.
Wenn man nun auf einen Button klickt, so soll er sich selber löschen und das Wort effektiv aus dem Array entfernen. Und genau das will einfach nicht funktionieren.
Ursprünglich ist alles auf Listen aufgebaut gewesen, und der lambda funktion habe ich die indizies übergeben. Mittlerweile benütze ich ein Dict,
welches glaube ich besser funktioniert.
Hier der code, aufbereitet zum ausprobieren:
Ich weiß dass ich die Buttons nicht ordentlich referenziere...
ich bin wirklich für jede Hilfe dankbar!
Lg
Fabian
Ich sitze nun seit einer Woche an diesem Problem, und bin langsam am verzweifeln. Ich stecke wohl einfach schon zu tief drinnen.
Folgendes Szenario:
Ich programmiere eine Database Software, und dafür gerade eine Entry Form. In dieser Entry Form gibt es einen Bereich, in dem man Worte aus einem Optionmenu auswählen kann.
Wenn ein Button ausgewählt wird, erstellt die callback function einen kleinen button darunter, mitsamt dem wort, welches dann auch zu einem array (liste, dict, etc) hinzugefügt wird. So weit so gut.
Die Buttons werden bei jeder aktion mit einer update function und einer for schleife neu erstellt.
Wenn man nun auf einen Button klickt, so soll er sich selber löschen und das Wort effektiv aus dem Array entfernen. Und genau das will einfach nicht funktionieren.
Ursprünglich ist alles auf Listen aufgebaut gewesen, und der lambda funktion habe ich die indizies übergeben. Mittlerweile benütze ich ein Dict,
welches glaube ich besser funktioniert.
Hier der code, aufbereitet zum ausprobieren:
Code: Alles auswählen
import tkinter as tk
from tkinter import ttk
def rel_add(*args):
operators[tkvar.get()] = ""
rel_buttons_update()
def del_button(name):
operators[name].destroy()
del operators[name]
rel_buttons_update()
def rel_buttons_update():
i = 0
for name, button in operators.items():
# print(name)
temp = tk.Button(master=rel_grid,
text=name, command=lambda x=name: del_button(name) )
operators[name] = temp
operators[name].grid(column=i, row=0, sticky="nw")
# print(operators)
i += 1
operators = {}
win = tk.Tk()
tkvar = tk.StringVar(win) # Create a Tkinter variable
choices_words = ["oolbath", "pflanze", "haus", "wasser", "brimbambum"] # Create Variable List
tkvar.set('Related Words...') # set the default option
choices_words.sort() # Sort List
tk.Label(win, text="Related Words: ").grid(row=0,column=0, sticky="w")
rel = tk.OptionMenu(win, tkvar, *choices_words)
rel.grid(row=0,column=1, sticky="w")
# Callbuck Function for Dropdown Menu
tkvar.trace("w", rel_add)
rel_grid = tk.Frame(win)
# Display the Buttons for the related Words
rel_grid.grid(row=1,column=1, sticky="w")
win.mainloop()
ich bin wirklich für jede Hilfe dankbar!
Lg
Fabian