alles klar, hab das und noch einiges anderes verbessert. Man kann jetzt nach dem Task-check die Tasks auswählen die man der Liste hinzufügen möchte und sie dann hinzufügen.
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.master.tk.call('wm', 'iconbitmap', self.master._w, '-default', 'glicon.ico')
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)
subprocess.call("start warnung.exe", shell = True)
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" + "\n".join(processes_closed))
elif len(processes_closed) > 0:
messagebox.showwarning(title = "Prozesse beendet",
message = "Folgende Prozesse wurden beendet:\n" + "\n".join(processes_closed) + "\nFolgende Prozesse konnten nicht Beendet werden:\n" + "\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" + "\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():
process_list = [process.strip() for process in process_entry.get().split(",") if len(process.strip()) > 4 and "." in process]
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():
def add_checked_tasks():
add_list = [added_tasks[i] for i in range(len(check_variables)) if check_variables[i].get()]
added_tasks_toplevel.destroy()
if process_entry.get() == "":
process_entry.insert("end", ", ".join(add_list))
elif process_entry.get().endswith(",") or process_entry.get().endswith(", "):
process_entry.insert("end", ", ".join(add_list))
else:
process_entry.insert("end", ", " + ", ".join(add_list))
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(" ")])
if len(added_tasks) == 0:
messagebox.showwarning(title = "Tasks", message = "Es sind keine Tasks hinzugekommen!")
else:
added_tasks_toplevel = tk.Toplevel(edit_toplevel)
added_tasks_toplevel.title("Tasks")
tasks_head_label = tk.Label(added_tasks_toplevel, text = "Folgende Tasks wurden geöffnet:")
tasks_head_label.grid(row = 0, column = 0, columnspan = 2)
check_variables = list()
for i in range(len(added_tasks)):
check_variables.append(tk.IntVar())
tk.Label(added_tasks_toplevel, text = added_tasks[i]).grid(row = i+1, column = 0)
tk.Checkbutton(added_tasks_toplevel, variable = check_variables[i]).grid(row = i+1, column = 2)
add_tasks_button = tk.Button(added_tasks_toplevel, text = "Hinzufügen", command = add_checked_tasks)
add_tasks_button.grid(row = len(added_tasks)+1, column = 0)
break_added_tasks_button = tk.Button(added_tasks_toplevel, text = "Abbrechen", command = added_tasks_toplevel.destroy)
break_added_tasks_button.grid(row = len(added_tasks)+1, column = 1)
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(edit_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()
Nur her mit weiteren Verbesserungsideen.