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