import tkinter as tk
from tkinter import ttk
import subprocess
class CountdownApp(tk.Tk):
def __init__(self):
super().__init__()
self.title("Shutdown Countdown")
self.geometry("250x150")
self.countdown_seconds = 0
self.timer_running = False
self.shutdown_process = None
self.style = ttk.Style()
self.style.theme_use("clam")
self.style.configure("TLabel", background="#333333", foreground="#ffffff")
self.style.configure("TEntry", fieldbackground="#555555", foreground="#ffffff")
self.style.configure("TButton", background="#555555", foreground="#ffffff")
self.configure(background="#333333")
self.countdown_label = ttk.Label(self, font=("Arial", 18))
self.countdown_label.pack(pady=10)
input_frame = ttk.Frame(self)
input_frame.pack(pady=5)
minutes_label = ttk.Label(input_frame, text="Minutes:")
minutes_label.pack(side="left", padx=5)
self.minutes_entry = ttk.Entry(input_frame, width=5)
self.minutes_entry.pack(side="left")
seconds_label = ttk.Label(input_frame, text="Seconds:")
seconds_label.pack(side="left", padx=5)
self.seconds_entry = ttk.Entry(input_frame, width=5)
self.seconds_entry.pack(side="left")
button_frame = ttk.Frame(self)
button_frame.pack(pady=5)
self.start_button = ttk.Button(button_frame, text="Start", command=self.start_countdown)
self.start_button.pack(side="left", padx=5)
self.cancel_button = ttk.Button(button_frame, text="Cancel", command=self.cancel_countdown, state="disabled")
self.cancel_button.pack(side="left")
def start_countdown(self):
try:
minutes = int(self.minutes_entry.get() or 0)
seconds = int(self.seconds_entry.get() or 0)
self.countdown_seconds = minutes * 60 + seconds
except ValueError:
self.countdown_label.config(text="Invalid input")
return
self.update_countdown_label()
self.timer_running = True
self.cancel_button.config(state="normal")
self.countdown_loop()
def cancel_countdown(self):
self.timer_running = False
if self.shutdown_process:
try:
self.shutdown_process.terminate()
except ProcessLookupError:
pass
self.shutdown_process = None
self.cancel_button.config(state="disabled")
def update_countdown_label(self):
minutes, seconds = divmod(self.countdown_seconds, 60)
countdown_text = f"{minutes:02d}:{seconds:02d}"
self.countdown_label.config(text=countdown_text)
def countdown_loop(self):
if self.countdown_seconds > 0 and self.timer_running:
self.update_countdown_label()
self.countdown_seconds -= 1
self.after(1000, self.countdown_loop)
elif self.countdown_seconds == 0 and self.timer_running:
self.timer_running = False
self.shutdown_system()
self.cancel_button.config(state="disabled")
def shutdown_system(self):
self.shutdown_process = subprocess.Popen(["shutdown", "-s", "-t", "0"], creationflags=subprocess.DETACHED_PROCESS)
if __name__ == "__main__":
app = CountdownApp()
app.mainloop()
Categories: Project
0 Comments