Ich versuche in meiner GUI ein Optionsfenster mit variablen Einstellungsmöglichkeiten zu realisieren.
Ich habe die verschiedenen Widgets in der Funktion in eine for-Schleife gepackt, um sie über die Funktionsparameter zu platzieren. Die Funktionsparameter werden mittels Radiobutton übergeben.
Meine Frage:
Kann ich das so machen, oder gibt es eine bessere Lösung?
Falls Ok, habe ich das Problem, das die Widgets (Umrandungen) wie Buttons immer sichtbar sind, auch wenn keine Buttons sein sollten.
Nach meinem Verständnis als Anfänger, liegt das Problem wahrscheinlich bei der Variable spalte in der for-Schleife die die Widgets Anordnungen speichert und erst beim beenden des Programms gelöscht werden. Wie kann ich das ändern?
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
import tkinter.ttk as ttk
class Optionen_Frame(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
# ----------------------------------- Layoutwidget -------------------------------------
def layoutwidget(buttonspalte,combospalte,checkspalte,widget_txt):
widget_txt1,widget_txt2,widget_txt3,widget_txt4,widget_txt5,widget_txt6 = widget_txt
self.como_txt = ('1. Jan', '1. Febr', '1. März', '1. Apr', '1. Mai', '1. Juni',
'1. Juli', '1. Aug', '1. Sept', '1. Okt', '1. Nov', '1. Dez',)
var = tk.StringVar()
eingabespalte = []
for spalte in range(6):
if spalte in buttonspalte:
button = tk.Button(self.widgetrahmen,
width=15,
height=2,
relief=tk.GROOVE,
justify=tk.CENTER)
button.grid(row=1, column=spalte + 1)
eingabespalte.append(button)
elif spalte in combospalte:
combo = ttk.Combobox(self.widgetrahmen,
width=10,
font=12,
values=self.como_txt,
justify=tk.CENTER)
combo.grid(row=1, column=spalte + 1)
eingabespalte.append(combo)
elif spalte in checkspalte:
check = tk.Checkbutton(self.widgetrahmen,
width=10,
height=2,
justify=tk.CENTER,
bg=farbe_innen,
activebackground=farbe_innen,
anchor=tk.W,
variable=var)
check.grid(row=1, column=spalte + 1)
eingabespalte.append(check)
else:
label = tk.Label(self.widgetrahmen,
width=15,
height=2,
bg=farbe_innen,
anchor=tk.E)
label.grid(row=1, column=spalte + 1)
eingabespalte.append(label)
erstes_widget = eingabespalte[0]
erstes_widget.config(text=widget_txt1)
zweites_widget = eingabespalte[1]
zweites_widget.config(text=widget_txt2)
drittes_widget = eingabespalte[2]
drittes_widget.config(text=widget_txt3)
viertes_widget = eingabespalte[3]
viertes_widget.config(text=widget_txt4)
füntes_widget = eingabespalte[4]
füntes_widget.config(text=widget_txt5)
sechstes_widget = eingabespalte[5]
sechstes_widget.config(text=widget_txt6)
# ----------------------------------- Layoutmanager -----------------------------------
def layoutmanager():
inhalt = self.var.get()
if inhalt == self.txt_neu:
self.textAnzeige.config(textvariable=self.var)
# [ Button ], [ Combobox ], [Checkbutton], ( Text )
layoutwidget([0],[5],[],('Neuer Eintrag\nspeichern','','','','Gültig ab:',''))
elif inhalt == self.txt_ändern:
self.textAnzeige.config(textvariable=self.var)
layoutwidget([0],[5],[2],('Änderung\nspeichern','','Mit Einfluss','','Gültig ab:',''))
elif inhalt == self.txt_löschen:
self.textAnzeige.config(textvariable=self.var)
layoutwidget([0,4,5,],[],[],('Eintrag\nlöschen','','','','Jahresanfang\nAlles auf Null','Alles\nlöschen'))
else:
self.textAnzeige.config(textvariable=self.var)
layoutwidget([0,1,3,4,5],[],[],('Nur Aktive\nanzeigen','Alle\nanzeigen','','ID-Nummer\n sortieren',
'Rechnungssteller\n sortieren','Jahreskosten\n sortieren'))
# ----------------------------------- Rahmen -------------------------------------------
farbe_innen = 'GREY85'
self.textAnzeige = tk.Label(self,)
self.textAnzeige.pack()
self.hauptrahmen = tk.Label(self,
bg=farbe_innen,
relief=tk.GROOVE)
self.hauptrahmen.pack(pady=10,padx=20)
self.radiorahmen = tk.Label(self.hauptrahmen,
bg=farbe_innen)
self.radiorahmen.pack(pady=10)
self.widgetrahmen = tk.Label(self.hauptrahmen,
bg=farbe_innen)
self.widgetrahmen.pack(pady=10)
# ----------------------------- Radiobutten ----------------------------------------
self.txt_ansicht = 'Datenansicht'
self.txt_neu = 'Neue Einträge speichern'
self.txt_ändern = 'Einträge ändern'
self.txt_löschen = 'Div. Löschvorgänge'
self.hf_titel = (self.txt_ansicht, self.txt_neu, self.txt_ändern, self.txt_löschen)
self.var = tk.StringVar()
self.var.set(self.txt_ansicht)
for a in self.hf_titel:
rb = tk.Radiobutton(self.radiorahmen,
text=a,
value=a,
width=28,
bg=farbe_innen,
activebackground=farbe_innen,
variable=self.var,
command=layoutmanager)
rb.pack(side=tk.LEFT)
self.layoutmanager = layoutmanager()
#===============================================================================
# ************************************************ HAUPTPROGRAMM **************************************
#===============================================================================
class Hauptprogramm(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.pack()
self.optionen = Optionen_Frame(self)
self.optionen.pack()
if __name__ == '__main__':
root = tk.Tk()
Hauptprogramm(master=root)
root.mainloop()