Untitled

 avatar
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