Untitled
def draw(self): """Modified draw method to incorporate pulse and press animations""" self.delete('all') # Calculate combined scale from both press and pulse animations combined_scale = self.press_scale * self.pulse_scale scaled_size = self.size * combined_scale # Get colors from bin configuration circle_color = self.bin_config['color_dark'] if self.dark_mode else self.bin_config['color'] ring_color = self.get_ring_color() progress_color = self.get_progress_color() bg_color = '#1c1c1e' if self.dark_mode else '#f5f5f7' # Configure canvas background self.configure(bg=bg_color) # Create new image for drawing self.im = Image.new('RGBA', (1000, 1000), bg_color) draw = ImageDraw.Draw(self.im) # Calculate dimensions for ring outer_padding = 40 ring_width = 40 circle_padding = 15 # For light mode, draw a white circle behind everything if not self.dark_mode: draw.ellipse( (outer_padding-ring_width, outer_padding-ring_width, 1000-outer_padding+ring_width, 1000-outer_padding+ring_width), fill='white' ) # Draw ring (trough) draw.arc( (outer_padding-ring_width, outer_padding-ring_width, 1000-outer_padding+ring_width, 1000-outer_padding+ring_width), -90, 270, ring_color, ring_width ) # Draw progress arc if self.fill_level > 0: angle = int(self.fill_level * 360 / 100) draw.arc( (outer_padding-ring_width, outer_padding-ring_width, 1000-outer_padding+ring_width, 1000-outer_padding+ring_width), -90, -90 + angle, progress_color, ring_width ) # Draw base circle with outline if not self.dark_mode: # White outline draw.ellipse( (outer_padding + circle_padding - 1, outer_padding + circle_padding - 1, 1000-outer_padding - circle_padding + 1, 1000-outer_padding - circle_padding + 1), fill='white' ) # Draw colored circle draw.ellipse( (outer_padding + circle_padding, outer_padding + circle_padding, 1000-outer_padding - circle_padding, 1000-outer_padding - circle_padding), fill=circle_color ) # Resize image with combined scaling resized = self.im.resize( (int(scaled_size), int(scaled_size)), Image.Resampling.LANCZOS ) self.arc = ImageTk.PhotoImage(resized) # Calculate centered position accounting for scaling x_pos = (self.size - scaled_size) / 2 y_pos = (self.size - scaled_size) / 2 # Display the image centered self.create_image( self.size/2, self.size/2, image=self.arc, anchor='center' ) # Get text color based on circle color def get_text_color(background_color): color = background_color.lstrip('#') rgb = tuple(int(color[i:i+2], 16) for i in (0, 2, 4)) luminance = (0.299 * rgb[0] + 0.587 * rgb[1] + 0.114 * rgb[2]) / 255 return '#000000' if luminance > 0.5 else '#ffffff' text_color = get_text_color(circle_color) # Get translated name root = self.winfo_toplevel() current_language = getattr(root, 'LANGUAGE', 'EN') displayed_name = self._bin_config.get_bin_name( self.bin_config, getattr(self, 'language', current_language) ) # Draw text with combined scaling font_size = int(18 * combined_scale) self.create_text( self.size/2, self.size/2, text=displayed_name, font=('Dongle', font_size, 'normal'), fill=text_color, justify='center', width=self.size-20 )
Leave a Comment