Ich war zu ungeduldig um zu warten und habe eben die neue Version geschrieben, in ner klasse, mit mainfunktion, keinem Code auf modulebene, ohne globals und ohne os aber eben noch mit time.sleep()
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
#Module importieren
import tkinter as tk
from tkinter import messagebox
import time
import pickle
import winsound
import subprocess
#Klasse definieren
class App:
#Hauptfenster initialisieren
def __init__(self, master):
self.master = master
self.master.title("Gamelimiter")
self.add_widgets()
#Widgets hinzufügen
def add_widgets(self):
self.radio_check = tk.IntVar()
self.block_check = tk.IntVar()
self.radio_check.set(1)
self.block_check.set(0)
#Widgets initialisieren
head_label = tk.Label(self.master, text = "Herzlich willkommen!\nWie lange möchtest du spielen?")
self.time_entry_h = tk.Entry(self.master, width = 4)
seperator_label = tk.Label(self.master, text = ":")
self.time_entry_m = tk.Entry(self.master, width = 4)
time_radio_1 = tk.Radiobutton(self.master, text = "Zeit herunterzählen", variable = self.radio_check, value = 1)
time_radio_2 = tk.Radiobutton(self.master, text = "als Uhrzeit verwenden", variable = self.radio_check, value = 2)
start_button = tk.Button(self.master, text = "Starten", command = self.countdown)
edit_processes_button = tk.Button(self.master, text = "Prozesse verwalten", command = self.edit_processes)
block_check_button = tk.Checkbutton(self.master, text = "dann eine Stunde blocken", variable = self.block_check)
self.time_entry_h.insert(10, "h")
self.time_entry_m.insert(10, "m")
#Widgets positionieren
head_label.grid(row = 0, column = 0, columnspan = 3)
self.time_entry_h.grid(row = 1, column = 0, sticky = "e")
seperator_label.grid(row = 1, column = 1)
self.time_entry_m.grid(row = 1, column = 2, sticky = "w")
time_radio_1.grid(row = 2, column = 0)
time_radio_2.grid(row = 2, column = 2)
start_button.grid(row = 3, column = 0, columnspan = 3, sticky = "w,e")
edit_processes_button.grid(row = 4, column = 2, sticky = "e")
block_check_button.grid(row = 4, column = 0, columnspan = 3, sticky = "w")
#Zeit einlesen, verarbeiten und herunterzählen
def countdown(self):
#Zeit zum herunterzählen
if self.radio_check.get() == 1:
if self.time_entry_h.get().isdigit() and 0 <= int(self.time_entry_h.get()) <= 60:
play_time = int(self.time_entry_h.get()) * 3600
else:
play_time = 0
if self.time_entry_m.get().isdigit() and 0 <= int(self.time_entry_m.get()) <= 60:
play_time += int(self.time_entry_m.get()) * 60
#Zeit bis zur Uhrzeit
else:
if self.time_entry_h.get().isdigit() and 0 <= int(self.time_entry_h.get()) <= 60:
time_end_m = int(self.time_entry_h.get()) * 60
hour_isset = True
else:
time_end_m = int(time.strftime("%H")) * 60
hour_isset = False
if self.time_entry_m.get().isdigit() and 0 <= int(self.time_entry_m.get()) <= 60:
time_end_m += int(self.time_entry_m.get())
elif not hour_isset:
time_end_m += int(time.strftime("%M"))
time_now_m = int(time.strftime("%H")) * 60 + int(time.strftime("%M"))
if time_now_m <= time_end_m:
play_time = (time_end_m - time_now_m)*60
else:
play_time = (time_end_m - time_now_m + 1440)*60
#Zählen starten
self.master.destroy()
if play_time != 0:
if play_time <= 300:
time.sleep(play_time -11)
else:
time.sleep(play_time - 300)
os.startfile("warnung.exe")
time.sleep(289)
winsound.PlaySound("beep.wav", winsound.SND_FILENAME)
self.kill_tasks()
#Prozesse überprüfen und beenden
def kill_tasks(self):
#Überprüfen des Befehls
def system_test():
if subprocess.call(["taskkill", "/IM", "testprozessname"], shell = True) == 128:
return("taskkill")
else:
return("tskill")
#Prozesse aus Datei einlesen
file_processes = open("prozesse.data", "rb")
processes = pickle.load(file_processes)
file_processes.close()
#Rückmeldung vorbereiten
processes_closed = []
processes_failed = []
processes_opened = str(subprocess.check_output("tasklist", shell = True), encoding='utf8')
#Prozesse versuchen zu beenden
self.befehl = system_test()
for process in processes:
if process in processes_opened:
if subprocess.call([self.befehl, "/F", "/IM", process, "/T"], shell = True) != 1:
processes_closed.append(process)
else:
processes_failed.append(process)
#Root erstellen
endroot = tk.Tk()
endroot.title("Beenden")
head_label = tk.Label(text = "Das Programm ist fertig!")
end_button = tk.Button(text = "Beenden", command = endroot.destroy)
head_label.grid(row = 0)
end_button.grid(row = 1, sticky = "w,e")
#Rückmeldung geben
if len(processes) == 0:
messagebox.showwarning(title = "Keine Prozesse", message = "Du hast noch keine Prozesse gespeichert!")
elif len(processes_closed) > 0 and len(processes_failed) == 0:
messagebox.showwarning(title = "Prozesse beendet",
message = "Folgende Prozesse wurden beendet:\n" + ", ".join(processes_closed))
elif len(processes_closed) > 0:
messagebox.showwarning(title = "Prozesse beendet",
message = "Folgende Prozesse wurden beendet:\n" + ", ".join(processes_closed) + "\nFolgende Prozesse konnten nicht Beendet werden:\n" + ", ".join(processes_failed))
elif len(processes_failed) > 0:
messagebox.showwarning(title = "Beenden fehlgeschlagen",
message = "Für folgende Prozesse reichen die Rechte nicht aus:\n(Dies lässt sich beheben indem das Programm\nals Administrator ausgeführt wird)\n" + ", ".join(processes_failed))
else:
messagebox.showwarning(title = "Keinen Prozess beendet",
message = "Keiner der gespeicherten Prozesse ist geöffnet!")
#Mainloop starten
endroot.mainloop()
if self.block_check.get() and len(processes) != 0:
self.block()
def edit_processes(self):
#Prozesse separieren, despacen und in die Datei schreiben
def safe_processes():
raw_text = str(process_entry.get())
process_list = []
if not raw_text == "":
while True:
if not raw_text == "":
if "," in raw_text:
process = raw_text[:raw_text.find(",")]
raw_text = raw_text[raw_text.find(",")+1:]
else:
process = raw_text
raw_text = ""
while True:
if " " in process:
process = process[:process.find(" ")] + process[process.find(" ")+1:]
else:
break
process_list.append(process)
else:
break
process_file = open("prozesse.data", "wb")
pickle.dump(process_list, process_file)
process_file.close()
messagebox.showwarning(title = "Speichern erfolgreich!", message = "Erfolgreich gespeichert!")
edit_toplevel.destroy()
#Tasks-einlesen-Dialog
def get_tasks():
#Tasks vergleichen und ausgeben
def compare_tasks():
#global tasks_before
tasks_after = str(subprocess.check_output("tasklist", shell = True), encoding='utf8').splitlines()[4:]
added_tasks = []
for task_a in tasks_after:
in_list = False
for task_b in tasks_before:
if task_a[:task_a.find(" ")] == task_b[:task_b.find(" ")]:
in_list = True
if not in_list:
added_tasks.append(task_a[:task_a.find(" ")])
print(added_tasks)
if len(added_tasks) > 0:
messagebox.showwarning(title = "Tasks", message = "Folgende Tasks sind hinzugekommen:\n" + "\n".join(added_tasks))
else:
messagebox.showwarning(title = "Tasks", message = "Es sind keine Tasks hinzugekommen!")
get_tasks_toplevel.destroy()
#Offene Prozesse einlesen
tasks_before = str(subprocess.check_output("tasklist", shell = True), encoding='utf8').splitlines()[4:]
#Toplevel initialisieren
get_tasks_toplevel = tk.Toplevel()
get_tasks_toplevel.title("Tasks einlesen")
#Widgets initialisieren
head_label = tk.Label(get_tasks_toplevel, text = "Starte das Spiel und drücke den Button!")
get_tasks_button = tk.Button(get_tasks_toplevel, text = "Überprüfen", command = compare_tasks)
head_label.grid(row = 0)
get_tasks_button.grid(row = 1, sticky = "w,e")
#Prozesse importieren
process_file = open("prozesse.data")
if process_file.read() == "":
text = ""
else:
process_file = open("prozesse.data", "rb")
text = ", ".join(pickle.load(process_file))
process_file.close()
#Toplevel initialisieren
edit_toplevel = tk.Toplevel()
edit_toplevel.title("Prozesse verwalten")
#Widgets initialisieren
head_label = tk.Label(edit_toplevel, text = "Gib hier die Prozesse deiner Spiele ein:")
process_entry = tk.Entry(edit_toplevel)
safe_button = tk.Button(edit_toplevel, text = "Speichern", command = safe_processes)
break_button = tk.Button(edit_toplevel, text = "Abbrechen", command = edit_toplevel.destroy)
get_button = tk.Button(edit_toplevel, text = "Tasks einlesen", command = get_tasks)
process_entry.insert(10, text)
#Widgets positionieren
head_label.grid(row = 0, column = 0, columnspan = 3)
process_entry.grid(row = 1, column = 0, columnspan = 3, sticky = "w,e")
safe_button.grid(row = 2, column = 0)
break_button.grid(row = 2, column = 1)
get_button.grid(row = 2, column = 2)
def block(self):
#Prozesse aus Datei importieren
file_processes = open("prozesse.data", "rb")
processes = pickle.load(file_processes)
file_processes.close()
#1 Stunde lang jede minute prüfen
i = 60
while i > 0:
i -= 1
time.sleep(60)
processes_opened = str(subprocess.check_output("tasklist", shell = True), encoding='utf8')
for process in processes:
if process in processes_opened:
subprocess.call([self.befehl, "/F", "/IM", process, "/T"], shell = True)
def main():
root = tk.Tk()
app = App(root)
root.mainloop()
if __name__ == "__main__":
main()