ich versuche mich gerade an einem kleinen Projekt zur Objekterkennung, ich habe auch soweit alles fertig und wollte es jetzt für meine Frau alles was einfacher zu bedienen machen.
Ich habe mich mal an Tkinter versucht und nach einigem hin und her bin ich jetzt komplett am Ende xD
Ich möchte ein zusätzliches Config Fenster laden, welches einen Scrollbalken hat, leider will er den Code nicht so annehmen, ich hatte Ihn auch schon mal drin aber nach zu viel drum herum werkeln und verschlimmbessern, bin ich jetzt soweit das er gar nicht mehr da ist.
Zusätzlich möchte ich einen FOV einrichten, der mir optisch anzeigt wieviel meine software sieht. Ich würde für den Anfang auch alles nehmen, vom Kreis über Rechtecke, hauptsache ich habe einen optischen Ansatz, am besten mit Schiebereglern

Und dann habe ich noch ein Problem beim Dateipfad, da möchte ich gerne für meine Frau einen Button einbauen der Ihr erlaubt die gewünschte .pt direkt auszuwählen und den Dateispeicherpfad dann direkt übernimmt.
Ich hänge euch mal hier den Code mit an und hoffe auf jemand der erbarmen nach 8 Stunden mit mir hat

Code: Alles auswählen
import tkinter as tk
from tkinter import filedialog
import json
import math
class ConfigEditor(tk.Tk):
def __init__(self, config_file):
super().__init__()
self.config_file = config_file
self.config_data = self.load_config()
self.config_values = {}
self.title("Config Editor")
self.create_widgets()
def create_widgets(self):
# Erstelle scrollbares Frame
scrollable_frame = tk.Frame(self)
# Füge Widgets zum scrollbaren Frame hinzu
row = 0
for key, value in self.config_data.items():
label = tk.Label(scrollable_frame, text=key)
label.grid(row=row, column=0, sticky="w")
if key == "Path":
entry = tk.Entry(scrollable_frame)
entry.grid(row=row, column=1)
entry.insert(tk.END, str(value))
self.config_values[key] = entry
# Button zum Auswählen des Speicherpfads hinzufügen
button = tk.Button(scrollable_frame, text="Pfad auswählen", command=self.select_path)
button.grid(row=row, column=2)
elif key == "Region":
entry = tk.Entry(scrollable_frame)
entry.grid(row=row, column=1)
entry.insert(tk.END, str(value))
self.config_values[key] = entry
# Canvas zum Anzeigen des FOV hinzufügen
fov_canvas = tk.Canvas(scrollable_frame, width=200, height=200, bg="white")
fov_canvas.grid(row=row, column=2, padx=10)
fov = int(value)
fov_angle = math.radians(fov)
fov_radius = 100
fov_start = math.radians(180) - fov_angle / 2
fov_end = math.radians(180) + fov_angle / 2
fov_canvas.create_arc(50, 50, 150, 150, start=math.degrees(fov_start), extent=math.degrees(fov_angle), style=tk.PIESLICE, fill="yellow")
fov_canvas.create_arc(50, 50, 150, 150, start=math.degrees(fov_start), extent=0.5, style=tk.PIESLICE, width=2, outline="black")
fov_canvas.create_arc(50, 50, 150, 150, start=math.degrees(fov_end) - 0.5, extent=0.5, style=tk.PIESLICE, width=2, outline="black")
elif isinstance(value, bool):
var = tk.BooleanVar(value=value)
checkbox = tk.Checkbutton(scrollable_frame, variable=var)
checkbox.grid(row=row, column=1)
self.config_values[key] = var
else:
entry = tk.Entry(scrollable_frame)
entry.grid(row=row, column=1)
entry.insert(tk.END, str(value))
self.config_values[key] = entry
row += 1
save_button = tk.Button(scrollable_frame, text="Save Config", command=self.save_config)
save_button.grid(row=row, column=0, columnspan=3)
# Platzieren des scrollbaren Frames
scrollable_frame.pack(side="left",fill="both", expand=True)
# Fenstergröße festlegen
self.geometry("400x400")
def load_config(self):
with open(self.config_file, 'r') as f:
config_data = json.load(f)
return config_data
def save_config(self):
config_copy = self.config_data.copy()
for key, value_widget in self.config_values.items():
if isinstance(value_widget, tk.BooleanVar):
config_copy[key] = value_widget.get()
elif isinstance(config_copy[key], list):
value = value_widget.get().replace("[", "").replace("]", "").split(",")
value = [float(v.strip()) if "." in v else int(v.strip()) for v in value]
config_copy[key] = value
else:
try:
value = int(value_widget.get())
except ValueError:
try:
value = float(value_widget.get())
except ValueError:
value = value_widget.get()
config_copy[key] = value
with open(self.config_file, 'w') as f:
json.dump(config_copy, f, indent=4)
print("Config saved successfully!")
def select_path(self):
file_path = filedialog.askopenfilename()
if file_path:
entry_widget = self.config_values.get("Path")
entry_widget.delete(0, tk.END)
entry_widget.insert(tk.END, file_path)
# Beispielaufruf
config_file = "config.json"
app = ConfigEditor(config_file)
app.mainloop()
