Untitled
unknown
plain_text
10 months ago
6.3 kB
10
Indexable
class LidAlertScreen(ctk.CTkToplevel):
def __init__(self, parent, dark_mode: bool = None, language='EN'):
super().__init__(parent)
print("\n=== Initializing LidAlertScreen ===")
# Get settings from root window
root = self.winfo_toplevel()
self.language = getattr(root, 'LANGUAGE', language)
self.dark_mode = getattr(root, 'DARK_MODE', dark_mode)
self._destroyed = False
self.parent = parent
# Initialize the reed switch
self.reed_switch = Button(25, pull_up=True)
self.reed_switch.when_pressed = self.handle_lid_closed
# Make it fullscreen and disable all close operations
self.overrideredirect(True)
self.geometry(f"{self.winfo_screenwidth()}x{self.winfo_screenheight()}+0+0")
self.protocol("WM_DELETE_WINDOW", lambda: None)
self.attributes('-topmost', True)
# Set background color based on dark mode
bg_color = '#1c1c1e' if self.dark_mode else '#f5f5f7'
border_color = '#2c2c2e' if self.dark_mode else '#e5e5e7'
self.configure(fg_color=bg_color)
# Create main container with padding
self.container = ctk.CTkFrame(self, fg_color=bg_color, corner_radius=0)
self.container.pack(fill='both', expand=True, padx=30, pady=30)
# Add a border around the alert box
self.border_frame = ctk.CTkFrame(self.container, fg_color=border_color, corner_radius=10)
self.border_frame.pack(fill='both', expand=True, padx=10, pady=10)
# Create colored alert box inside the border (using pastel red)
pastel_red = "#FFB3B3" # Light pastel red
self.alert_box = ctk.CTkFrame(self.border_frame, fg_color=pastel_red, corner_radius=8)
self.alert_box.pack(fill='both', expand=True, padx=5, pady=5)
# Add the warning message
message_text = TRANSLATIONS[self.language].get('lid_open_warning',
"WARNING: Lid is open!\nPlease close the lid to continue.")
self.message_label = ctk.CTkLabel(
self.alert_box,
text=message_text,
font=('Dongle', 36),
text_color='#000000'
)
self.message_label.place(relx=0.5, rely=0.35, anchor='center')
# Add warning icon
try:
icon_image = ctk.CTkImage(
light_image=Image.open("icons/warning-b.png"),
dark_image=Image.open("icons/warning-b.png"),
size=(65, 65)
)
self.icon_label = ctk.CTkLabel(
self.alert_box,
image=icon_image,
text=""
)
self.icon_label.place(relx=0.5, rely=0.55, anchor='center')
except Exception as e:
print(f"Error loading warning icon: {e}")
self.icon_label = ctk.CTkLabel(
self.alert_box,
text="⚠️",
font=('Dongle', 48)
)
self.icon_label.place(relx=0.5, rely=0.55, anchor='center')
# Start monitoring thread
self.monitor_thread = threading.Thread(target=self.monitor_lid, daemon=True)
self.monitor_thread.start()
def handle_lid_closed(self):
"""Handle lid closed event"""
print("Lid closed detected")
if not self._destroyed:
self.after(0, self.destroy)
self._destroyed = True
def monitor_lid(self):
"""Monitor lid status"""
while not self._destroyed:
if self.reed_switch.is_pressed: # Magnet detected (lid closed)
print("Lid closed detected in monitoring thread")
if not self._destroyed:
self.after(0, self.destroy)
self._destroyed = True
break
time.sleep(0.1)
def cleanup(self):
"""Cleanup resources"""
self._destroyed = True
if hasattr(self, 'reed_switch'):
self.reed_switch.close()
class LidMonitor:
def __init__(self, parent):
print("\n=== Initializing LidMonitor ===")
self.parent = parent
self._running = True
self._alert_shown = False
try:
# Initialize the reed switch
self.reed_switch = Button(25, pull_up=True)
print("Reed switch initialized successfully")
# Start monitoring in a separate thread
self.monitor_thread = threading.Thread(target=self._monitor_lid, daemon=True)
self.monitor_thread.start()
print("Lid monitoring thread started")
except Exception as e:
print(f"Error initializing LidMonitor: {e}")
self.reed_switch = None
def _monitor_lid(self):
"""Monitor lid status in a separate thread"""
print("Starting lid monitoring...")
while self._running:
try:
if not self.reed_switch.is_pressed: # Lid is open
if not self._alert_shown:
print("Lid open detected - showing alert")
self.parent.after(0, lambda: self._show_alert())
self._alert_shown = True
else: # Lid is closed
if self._alert_shown:
print("Lid closed detected")
self._alert_shown = False
time.sleep(0.1)
except Exception as e:
print(f"Error in lid monitoring: {e}")
time.sleep(1)
def _show_alert(self):
"""Show the lid alert screen"""
if not hasattr(self, '_lid_alert') or not self._lid_alert:
self._lid_alert = LidAlertScreen(self.parent)
def cleanup(self):
"""Clean up resources"""
print("Cleaning up LidMonitor...")
self._running = False
if hasattr(self, 'reed_switch') and self.reed_switch:
self.reed_switch.close()
if hasattr(self, '_lid_alert') and self._lid_alert:
self._lid_alert.cleanup()Editor is loading...
Leave a Comment