ich habe mir zu Übungszwecken folgende Aufgabe gestellt:
4 Checkbuttons sollen mit einem Eingabefeld gekoppelt werden, oder anders gesagt, die Checkbuttons und das Eingabefeld beeinflussen sich gegenseitig. Was ich hinbekommen habe, ist die eine Richtung: Werden die Checkbuttons in der Gui gesetzt, dann wird in das Eingabefeld das entsprechende Muster übertragen (0 bedeutet: Checkbutton nicht gesetzt / 1 bedeutet: Checkbutton gesetzt). Beispiel: Wird der erste und der letzte Checkbutton gesetzt, wird in das Eingabefeld eine 1001 übertragen.
Die andere Richtung bekomme ich nicht hin, wenn zum Beispiel in das Eingabefeld 1100 eingegeben wird, dann sollen die ersten beiden Checkbuttons gesetzt werden. Das gleiche Problem habe ich mit der Änderung des Textes der Checkbuttons (die Texte sollen nach Betätigung des Buttons geändert werden). Mir ist also nicht klar, wie man loop-generierte widgets ansprechen kann. Ich habe es mit Listen versucht, in die der Name des widgets geschrieben wird, aber auch hier mir fehlt mir wohl noch ein Schritt zum Erfolg.
Für einen einzelner Checkbutton (der aufgrund seines eindeutigen Namens direkt angesprochen werden kann), sind beide Richtungen kein Problem.
Unten stehend der Code dazu, für einen Tipp wäre ich dankbar (Fehleingaben über try/except noch nicht abgefangen). Und wenn Euch sonst noch was auffällt, was an dem Code nicht so dolle ist, über entsprechende Hinweise würde ich freuen. Ich stehe bzgl. Python noch am Anfang.
Schon mal Danke…
Code: Alles auswählen
import tkinter as tk
from functools import partial
NUMBER_CHECKBOX=4
class Gui(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
#entry
self.entry_var= tk.StringVar()
self.entry_var.trace('w', self.entry_change)
self.entry = tk.Entry(self, textvariable=self.entry_var)
self.entry.grid(sticky=tk.W, row=0, column=0)
#label
self.label = tk.Label(self)
self.label.grid(sticky=tk.W, row=1, column=0)
#checkboxen loopgeneriert
self.list_checkbox_value=[]
self.list_checkbox_text=[]
for idx in range(NUMBER_CHECKBOX):
self.checkbox_text_var = tk.StringVar()
self.checkbox_text_var='Check_'+str(idx)
self.list_checkbox_text.append(self.checkbox_text_var)
self.checkbox_value_var = tk.IntVar()
self.list_checkbox_value.append('0')
self.checkbox = tk.Checkbutton(self,text=self.checkbox_text_var, variable=self.checkbox_value_var)
self.checkbox.config(command=partial(self.checkbox_change, self.checkbox_text_var, self.checkbox_value_var))
self.checkbox.grid(sticky=tk.W, row=2+idx, column=0)
#button
self.button = tk.Button(self,text='Ändere Text Checkboxen', command=self.checkbox_text_change)
self.button.grid(sticky=tk.W, row=7, column=0)
#einzelcheckbox
self.checkbox_single_value = tk.IntVar()
self.checkbox_single_text = tk.StringVar()
self.checkbox_single_text.set('Eingabefeld befüllt')
self.checkbox_single = tk.Checkbutton(self,textvariable=self.checkbox_single_text, variable=self.checkbox_single_value, command=self.checkbox_single_change)
self.checkbox_single.grid(sticky=tk.W, row=8, column=0)
def entry_change(self,a, *args):
self.label['text']=self.entry_var.get()
if self.entry_var.get()=='':
self.checkbox_single_value.set(0)
else:
self.checkbox_single_value.set(1)
#self.checkbox_value.set(1)# ->So funkiert es nicht
def checkbox_change(self, checkbox_text, checkbox_value):
idx=int(self.list_checkbox_text.index(checkbox_text))
self.list_checkbox_value[idx]=str(checkbox_value.get())
anzeige_label=("".join(self.list_checkbox_value))
if anzeige_label=='0000':
anzeige_label=''
self.label['text']=anzeige_label
self.entry_var.set(anzeige_label)
def checkbox_single_change(self,*args):
if self.checkbox_single_value.get()==0:
self.entry_var.set('')
def checkbox_text_change(self):
self.checkbox_single_text.set ('neue Bezeichnung')
#self.checkbox_text_var.set ('Check_loop')->So funkiert es nicht
def main():
root = tk.Tk()
root.title("test_2")
root.geometry('150x200')
gui = Gui(root)
gui.pack()
root.mainloop()
if __name__ == "__main__":
main()