Code: Alles auswählen
import tkinter as tk
from tkinter import messagebox
import subprocess
import time
class App:
def __init__(self, master):
self.master = master
self.master.title("Shutdowner")
self.master.tk.call('wm', 'iconbitmap', self.master._w, '-default', 'sicon.ico')
self.add_widgets()
def add_widgets(self):
#Variablen initialisieren
self.radio_var = tk.IntVar()
self.radio_var.set(0)
self.check_var = tk.IntVar()
self.check_var.set(0)
#Bilder initialisieren
self.shutdown_image = tk.PhotoImage(file = "shutdown.gif")
self.restart_image = tk.PhotoImage(file = "restart.gif")
self.logout_image = tk.PhotoImage(file = "logout.gif")
#Widgets initialisieren
head_label = tk.Label(self.master, text = "Herzlich willkommen zum Shutdowner!", font = "Arial 15")
description_label = tk.Label(self.master, text = "Gib hier ein, wann der PC heruntergefahren werden soll:")
entry_frame = tk.Frame(self.master)
self.day_entry = tk.Entry(entry_frame, width = 10)
colon1_Label = tk.Label(entry_frame, text = ":")
self.hour_entry = tk.Entry(entry_frame, width = 10)
colon2_Label = tk.Label(entry_frame, text = ":")
self.minute_entry = tk.Entry(entry_frame, width = 10)
count_radio = tk.Radiobutton(self.master, text = "Zeit herunterzählen", variable = self.radio_var, value = 0)
clock_radio = tk.Radiobutton(self.master, text = "Stunden und Minuten als Uhrzeit verwenden", variable = self.radio_var, value = 1)
check_frame = tk.Frame(self.master)
message_check = tk.Checkbutton(check_frame, variable = self.check_var)
self.message_time_entry = tk.Entry(check_frame, width = 4)
message_label = tk.Label(check_frame, text = "Minuten vorher eine Warnung anzeigen.")
shutdown_button = tk.Button(self.master, image = self.shutdown_image, command = self.shutdown)
restart_button = tk.Button(self.master, image = self.restart_image, command = self.restart)
logout_button = tk.Button(self.master, image = self.logout_image, command = self.logout)
self.day_entry.insert(0, "Tage")
self.hour_entry.insert(0, "Stunden")
self.minute_entry.insert(0, "Minuten")
#Widgets positionieren
head_label.grid(row = 0, column = 0, columnspan = 3)
description_label.grid(row = 1, column = 0, columnspan = 3)
entry_frame.grid(row = 2, column = 0, columnspan = 3)
self.day_entry.grid(row = 0, column = 0)
colon1_Label.grid(row = 0, column = 1)
self.hour_entry.grid(row = 0, column = 2)
colon2_Label.grid(row = 0, column = 3)
self.minute_entry.grid(row = 0, column = 4)
count_radio.grid(row = 3, column = 0, columnspan = 3, sticky = "w")
clock_radio.grid(row = 4, column = 0, columnspan = 3, sticky = "w")
check_frame.grid(row = 5, column = 0, columnspan = 3, sticky = "w")
message_check.grid(row = 0, column = 0)
self.message_time_entry.grid(row = 0, column = 1)
message_label.grid(row = 0, column = 2)
shutdown_button.grid(row = 6, column = 0)
restart_button.grid(row = 6, column = 1)
logout_button.grid(row = 6, column = 2)
def shutdown(self):
parameters = (self.day_entry.get(),
self.hour_entry.get(),
self.minute_entry.get(),
self.radio_var.get(),
self.check_var.get(),
self.message_time_entry.get(),
"shutdown -s -t 1 /f")
self.run_command(*parameters)
def restart(self):
parameters = (self.day_entry.get(),
self.hour_entry.get(),
self.minute_entry.get(),
self.radio_var.get(),
self.check_var.get(),
self.message_time_entry.get(),
"shutdown -r -t 1 /f")
self.run_command(*parameters)
def logout(self):
parameters = (self.day_entry.get(),
self.hour_entry.get(),
self.minute_entry.get(),
self.radio_var.get(),
self.check_var.get(),
self.message_time_entry.get(),
"shutdown -l -t 1 /f")
self.run_command(*parameters)
def run_command(self, day, hour, minute, mode, warn_check, warn_time, command):
#Zeit zum herunterzählen
time_now = int(time.strftime("%H")) * 3600 + int(time.strftime("%M")) * 60
if mode == 0:
if day.isdigit() and 0 <= int(day) <= 1000:
sleep_time = int(day) * 86400
else:
sleep_time = 0
if hour.isdigit() and 0 <= int(hour) < 60:
sleep_time += int(hour) * 3600
if minute.isdigit() and 0 <= int(minute) < 60:
sleep_time += int(minute) * 60
#Zeit bis zur Uhrzeit
else:
if day.isdigit() and 0 < int(day) <= 32:
time_end_day = int(day)
else:
time_end_day = 0
if hour.isdigit() and 0 <= int(hour) < 24:
time_end = int(hour) * 3600
else:
time_end = 0
if minute.isdigit() and 0 < int(minute) < 60:
time_end += int(minute) * 60
if time_end_day != 0:
sleep_time = (86400 - int(time.strftime("%H")) * 3600 - int(time.strftime("%M")) * 60) + (time_end_day - 1) * 86400 + time_end
else:
if time_now < time_end:
sleep_time = (time_end - time_now)
else:
sleep_time = 0
#Datum und Uhrzeit ermitteln
if (time_now + sleep_time) > 86400:
check_message_day = (time_now + sleep_time) // 86400
else:
check_message_day = 0
check_message_rest = (time_now + sleep_time) % 86400
check_message_hour = check_message_rest // 3600
check_message_rest = check_message_rest % 3600
check_message_minute = check_message_rest // 60
#Messagetext erstellen und message starten
message_text = "Möchten sie ihren PC wirklich "
if check_message_day == 0:
message_text += "heute um "
elif check_message_day == 1:
message_text += "morgen um "
elif check_message_day == 2:
message_text += "übermorgen um "
else:
message_text += "in " + str(check_message_day) + " Tagen um "
message_text += str(check_message_hour) if len(str(check_message_hour)) == 2 else "0" + str(check_message_hour)
message_text += ":"
message_text += str(check_message_minute) if len(str(check_message_minute)) == 2 else "0" + str(check_message_minute)
message_text += " uhr "
if command == "shutdown -s -t 1 /f":
message_text += "herunterfahren lassen?"
if command == "shutdown -r -t 1 /f":
message_text += "neustarten lassen?"
if command == "shutdown -l -t 1 /f":
message_text += "abmelden lassen?"
if messagebox.askyesno(title = "Starten", message = message_text):
#Herunterzählen starten
self.master.destroy()
if warn_check and warn_time.isdigit() and int(warn_time)*60 < sleep_time:
time.sleep(sleep_time - warn_time * 60)
subprocess.call("start warning.exe", shell = True)
time.sleep(warn_time * 60)
subprocess.call(command, shell = True)
else:
time.sleep(sleep_time)
subprocess.call(command, shell = True)
def main():
root = tk.Tk()
app = App(root)
root.mainloop()
if __name__ == "__main__":
main()
Die warning.exe kann man im programmcode ja in warnung.pyw ändern und eine warning.pyw mit folgendem Code in den selben Ordner stecken:
Code: Alles auswählen
from tkinter import messagebox
import tkinter as tk
root = tk.Tk()
root.withdraw()
messagebox.showwarning(title = "Erinnerung", message = "Erinnerung: Der Shutdowner ist aktiv!")
root.destroy()
Gruß