Untitled
unknown
plain_text
6 months ago
4.6 kB
4
Indexable
import customtkinter as ctk import math from PIL import Image, ImageDraw import time import threading class CircularProgressBar(ctk.CTkCanvas): def __init__(self, parent, size=150, fg_color="#333333", progress_color="#ffffff", bg_color="transparent", text="", text_color="#ffffff", **kwargs): super().__init__(parent, width=size, height=size, bg=bg_color, highlightthickness=0, **kwargs) self.size = size self.fg_color = fg_color self.progress_color = progress_color self.text_color = text_color self.progress = 0 self.target_progress = 0 self.text = text # Initialize circle padding = 5 self.circle_coords = (padding, padding, self.size-padding, self.size-padding) self.draw_widget() # Start animation thread self.animation_thread = None self.running = True def draw_widget(self): self.delete("progress") self.delete("background") self.delete("text") # Draw background circle self.create_oval(self.circle_coords, fill=self.fg_color, tags="background") if self.progress > 0: start_angle = 90 extent = -(self.progress * 360) / 100 # Draw progress arc arc_color = "#ff4444" if self.progress >= 90 else self.progress_color self.create_arc(self.circle_coords, start=start_angle, extent=extent, fill="", width=8, tags="progress", outline=arc_color) # Draw text self.create_text(self.size/2, self.size/2, text=self.text, fill=self.text_color, font=("Helvetica", int(self.size/10), "bold"), tags="text") # Draw percentage self.create_text(self.size/2, self.size/2 + self.size/6, text=f"{int(self.progress)}%", fill=self.text_color, font=("Helvetica", int(self.size/12)), tags="text") def set_progress(self, progress): self.target_progress = progress if self.animation_thread is None or not self.animation_thread.is_alive(): self.animation_thread = threading.Thread(target=self._animate_progress) self.animation_thread.start() def _animate_progress(self): while abs(self.progress - self.target_progress) > 0.5: if self.progress < self.target_progress: self.progress += 2 else: self.progress -= 2 self.draw_widget() time.sleep(0.016) # ~60 FPS self.progress = self.target_progress self.draw_widget() class WasteSortingApp(ctk.CTk): def __init__(self): super().__init__() # Configure window self.title("Waste Sorting Progress") self.geometry("1024x600") # Configure grid self.grid_columnconfigure((0, 1, 2, 3), weight=1) self.grid_rowconfigure(0, weight=1) # Set theme ctk.set_appearance_mode("dark") # Create progress bars self.progress_bars = {} configs = [ ("Biomüll", "#8B4513", "#A0522D"), ("Gelbe Sack", "#FFD700", "#DAA520"), ("Papier", "#4169E1", "#1E90FF"), ("Restmüll", "#808080", "#A9A9A9") ] for idx, (name, color, progress_color) in enumerate(configs): frame = ctk.CTkFrame(self, fg_color="transparent") frame.grid(row=0, column=idx, padx=10, pady=(20, 0), sticky="nsew") progress_bar = CircularProgressBar( frame, size=150, fg_color=color, progress_color=progress_color, text=name, text_color="white" ) progress_bar.pack(pady=20) slider = ctk.CTkSlider( frame, from_=0, to=100, orientation="horizontal", command=lambda value, pb=progress_bar: pb.set_progress(value) ) slider.pack(pady=10, padx=20) self.progress_bars[name] = (progress_bar, slider) if __name__ == "__main__": app = WasteSortingApp() app.mainloop()
Editor is loading...
Leave a Comment