Checkbuttons soll verschwinden bei User-Aktion
Verfasst: Donnerstag 16. März 2023, 09:47
Guten Morgen zusammen,
ich benötige mal wieder euere Hilfe.
Ich hatte kürzlich mal ein Thread eröffnet in dem es um Messwerte ging. Da ich noch keine aktuellen Daten habe, wollte ich das GUI mal vorbereiten.
Ich hätte gerne folgendes:
Der Benutzer kann eine oder mehrere Datein auswählen. Der Name oder die Namen der ausgewählten Dateien werden als Checkboxen aufgelistet.
Wenn dann eine Checkbox angewählt wird, dann sollen die Spalten, die sich in der Datei befinden, aufgelistet werden. Wieder als Checkboxen.
So weit funktioniert das auch, aber es wäre schön wenn die angezeigten Spalten wieder verschwinden, wenn ich den Hacken der ausgewählten Datei wieder wegmache.
Das funktioniert bei mir nicht, weil ich die Checkboxen an keinen Namen gebunden habe und ich nicht weis wie ich die sinnvoll an Namen binden soll, da die Anzahl nicht fest vorgegeben wird und ich ja nicht einfach mal 20 Checkboxen vorbelegen will/kann/soll/darf.
Ich habe hier mal ein Beispielcode, der zeigt jetzt zwar keine Spalten an, aber das Prinzip ist das gleiche, die erstellten Checkboxen sollen verschwinden, wenn ich die Datei wieder abwähle.
Wenn ich die Checkboxen an Namen binde, dann könnte ich als Namen den Dateinamen verwenden, aber ich würde die Namen das auserhalb der '__init__' erstellen. Soll ich in der '__init__' eine leere Liste für die Checkboxen erstellen, so wie ich dass auch mit dem Wörterbuch gemacht habe? Aber das wäre ja auch schon fast ein Drama, dann füge ich jede Checkbox der Liste hinzu, dann muss ich noch einmal durch die Liste gehen wegen 'grid', weil das ja None zurück gibt und meine Liste sonst aus None anstatt aus Checkbox-Objekten bestehen würde.
Das wäre dann so:
Aber das haut nur in einem Durchgang hin, weil ich ja immer weitere Objekte an die Liste anhänge, dann passt mein Index nicht mehr. Und Objekte aus der Liste löschen bringt auch alles durcheinander.
Nach dem ich nun lange genug eure Lösungen gesehen habe, fühlt sich das falsch/kompliziert an. Daher bitte ich euch um ein zwei Hinweise, wie man das machen würde.
Vielleicht noch ein paar Hintergrundinfos wieso ich das so haben will. Die Dateien mit den Messwerten sind csv-Dateien und ich will die Messwerte grafisch darstellen. Dabei soll der Benutzer auswählen können, welche Messwerte er angezeigt haben will. Entweder in einzelnen Diagrammen nebeneinander oder beispielsweise Messwerte mit der gleichen Einheiten und dem gleichen Zeitstempel in einem Diagramm. Als Beispiel, ich habe zwei Versuche, also zwei Dateien, nun will ich in einem Diagramm sehen wie sich der Druck voneinander unterscheidet. Dann wähle ich beide Dateien aus, wähle dann in beiden Spalten den Druck aus und dann könnte es noch einen Button oder Checkbox geben, mit der Option in einem Diagramm anzeigen.
Vielen Dank und Grüße
Dennis
ich benötige mal wieder euere Hilfe.
Ich hatte kürzlich mal ein Thread eröffnet in dem es um Messwerte ging. Da ich noch keine aktuellen Daten habe, wollte ich das GUI mal vorbereiten.
Ich hätte gerne folgendes:
Der Benutzer kann eine oder mehrere Datein auswählen. Der Name oder die Namen der ausgewählten Dateien werden als Checkboxen aufgelistet.
Wenn dann eine Checkbox angewählt wird, dann sollen die Spalten, die sich in der Datei befinden, aufgelistet werden. Wieder als Checkboxen.
So weit funktioniert das auch, aber es wäre schön wenn die angezeigten Spalten wieder verschwinden, wenn ich den Hacken der ausgewählten Datei wieder wegmache.
Das funktioniert bei mir nicht, weil ich die Checkboxen an keinen Namen gebunden habe und ich nicht weis wie ich die sinnvoll an Namen binden soll, da die Anzahl nicht fest vorgegeben wird und ich ja nicht einfach mal 20 Checkboxen vorbelegen will/kann/soll/darf.
Ich habe hier mal ein Beispielcode, der zeigt jetzt zwar keine Spalten an, aber das Prinzip ist das gleiche, die erstellten Checkboxen sollen verschwinden, wenn ich die Datei wieder abwähle.
Code: Alles auswählen
import tkinter as tk
from tkinter import ttk
from tkinter.filedialog import askopenfilenames
from pathlib import Path
class SensorData(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.user_choices = {}
ttk.Label(self, text="Datei(en) mit Messwerte auswählen").grid(row=0, column=0)
ttk.Button(self, text="Öffnen", command=self.show_files).grid(row=1, column=0)
@staticmethod
def select_files():
return [Path(file) for file in askopenfilenames()]
def read_files(self):
return self.select_files()
def show_files(self):
sensor_files = self.read_files()
for index, file in enumerate(sensor_files, 2):
self.user_choices[file] = tk.IntVar()
ttk.Checkbutton(
self,
text=str(file.stem),
onvalue=True,
offvalue=False,
variable=self.user_choices[file],
command=self.update_selected_files,
).grid(row=index, column=0)
def update_selected_files(self):
for index, (file, selected) in enumerate(self.user_choices.items(), 2):
if selected.get():
ttk.Checkbutton(self, text=file).grid(row=1, column=index)
def main():
root = tk.Tk()
root.title("Sensordaten auslesen")
app = SensorData(root)
app.pack()
app.mainloop()
if __name__ == "__main__":
main()
Das wäre dann so:
Code: Alles auswählen
import tkinter as tk
from tkinter import ttk
from tkinter.filedialog import askopenfilenames
from pathlib import Path
class SensorData(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.user_choices = {}
self.checkboxes = []
ttk.Label(self, text="Datei(en) mit Messwerte auswählen").grid(row=0, column=0)
ttk.Button(self, text="Öffnen", command=self.show_files).grid(row=1, column=0)
@staticmethod
def select_files():
return [Path(file) for file in askopenfilenames()]
def read_files(self):
return self.select_files()
def show_files(self):
sensor_files = self.read_files()
for index, file in enumerate(sensor_files, 2):
self.user_choices[file] = tk.IntVar()
ttk.Checkbutton(
self,
text=str(file.stem),
onvalue=True,
offvalue=False,
variable=self.user_choices[file],
command=self.update_selected_files,
).grid(row=index, column=0)
def update_selected_files(self):
for index, (file, selected) in enumerate(self.user_choices.items(), 2):
if selected.get():
self.checkboxes.append(ttk.Checkbutton(self, text=file))
self.checkboxes[index - 2].grid(row=1, column=index)
else:
try:
self.checkboxes[index - 2].destroy()
except IndexError:
pass
def main():
root = tk.Tk()
root.title("Sensordaten auslesen")
app = SensorData(root)
app.pack()
app.mainloop()
if __name__ == "__main__":
main()
Nach dem ich nun lange genug eure Lösungen gesehen habe, fühlt sich das falsch/kompliziert an. Daher bitte ich euch um ein zwei Hinweise, wie man das machen würde.
Vielleicht noch ein paar Hintergrundinfos wieso ich das so haben will. Die Dateien mit den Messwerten sind csv-Dateien und ich will die Messwerte grafisch darstellen. Dabei soll der Benutzer auswählen können, welche Messwerte er angezeigt haben will. Entweder in einzelnen Diagrammen nebeneinander oder beispielsweise Messwerte mit der gleichen Einheiten und dem gleichen Zeitstempel in einem Diagramm. Als Beispiel, ich habe zwei Versuche, also zwei Dateien, nun will ich in einem Diagramm sehen wie sich der Druck voneinander unterscheidet. Dann wähle ich beide Dateien aus, wähle dann in beiden Spalten den Druck aus und dann könnte es noch einen Button oder Checkbox geben, mit der Option in einem Diagramm anzeigen.
Vielen Dank und Grüße
Dennis