Shutdowner - noch so ein Shutdown-Timer ;)
Verfasst: Donnerstag 19. Juli 2012, 22:30
Weil es "relativ einfach" ist so ein Programm zu schreiben, hab auch ich es getan, hier mein Shutdowner
Er ist nochnicht perfekt, aber er sollte funktionieren 
Die warning.exe kann man im programmcode ja in warnung.pyw ändern und eine warning.pyw mit folgendem Code in den selben Ordner stecken:Mal wieder sind alle Ideen und Vorschläge gerne gesehen.
Gruß

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ß