Untitled
unknown
plain_text
a year ago
4.6 kB
5
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