ich versuche gerade meinen früheren Punktezähler auch für den Nutzer ein wenig angenehmer zu gestalten. So stoß ich auf GUI und probierte ein wenig mit TkInter. Es klappt alles soweit ziemlich gut, bis ich eine Uhrzeit hinzufügen wollte, die sich alle 60 Sekunden aktualisiert.
Ich weiß, dass sich Schleifen und Tkinter nicht gut vertragen und deswegen habe ich mich an Threads herangesetzt.
Probleme jetzt:
Es funtkioniert trotzdem nicht und ich kann mir nicht erkären wieso!
Ich finde irgendwie nichts dazu, wie ich den Thread entferne/beende/lösche! (Das soll passieren, sobald das Fenster geschlossen ist)
Man könnte jetzt sagen, das sei nicht wichtig und man könnte es weglassen, aber ich möchte anschließend auch noch mit Tastatureingaben arbeiten und da Schleifen sich ja nicht vertragen, muss ich da ja wieder mit threads ran!
Code: Alles auswählen
from tkinter import *
from tkinter import messagebox
from datetime import *
import threading
import time
#Daten einlesen
file = open("Punktezähler_Daten.txt", "r")
spieler = file.readline().strip()
punkte = file.readline().strip()
datum = file.readline()
file.close
#Daten bearbeiten und Format anpassen
listeNamen = spieler.split(" ")
punktestand = punkte.split(" ")
print(punktestand)
punktestand = list(map(int, punktestand))
#Erzeugen des Fensters
fenster = Tk()
fenster.title("Punktezähler")
fenstergeschlossen = False
#Alle Definitionen:
HeuteDatum = date.today().strftime("%d.%m.%Y")
#Startdefinitionen
def ja():
Button1.config(text = "Info!", command = information)
Button2.config(text= "Hinzufügen!", command = hinzufügen )
eingabe.grid(row = 6, column = 0, padx= 5 , pady= 5, columnspan= 2)
info1.config(text = "")
info2.config(text = "")
def nein():
global listeNamen, punktestand
listeNamen = []
punktestand = []
print(listeNamen)
namenbox.delete(0, END)
punktebox.delete(0, END)
info1.config(text = "")
info2.config(text = "")
Button1.config(text = "Info!", command = informationNeueDaten)
Button2.config(text= "Hinzufügen!", command = SpielerHinzufügen)
eingabe.grid(row = 6, column = 0, padx= 5 , pady= 5, columnspan= 2)
Button3.grid(row = 7, column = 0, padx= 5, pady= 5)
ende.grid(row = 7, column = 1, padx= 5 , pady= 5)
def informationNeueDaten():
info1.config(text = "Spieler unten eingeben!")
info2.config(text = "Und auf Hinzufügen klicken!")
def SpielerHinzufügen():
NeuerSpieler = eingabe.get()
info1Inhalt = info1.cget("text")
if info1Inhalt == "Unbedingt Spieler eingeben!" or info1Inhalt == "Es gibt diesen Spieler bereits schon!":
info1.config(text = "")
if NeuerSpieler == "":
info1.config(text = "Unbedingt Spieler eingeben!")
info2.config(text = "")
else:
try:
listeNamen.index(NeuerSpieler)
except:
listeNamen.append(NeuerSpieler)
punktestand.append(0)
namenbox.insert("end", listeNamen[-1])
punktebox.insert("end", punktestand[-1])
print(listeNamen , "\n" , punktestand)
else:
info1.config(text = "Es gibt diesen Spieler bereits schon!")
eingabe.delete(0, "end")
def HinzufügenBeenden():
Button1.config(command = information)
Button2.config(command = hinzufügen)
info1.config(text = "")
info2.config(text = "")
Button3.destroy()
ende.grid(row = 7, column = 0, padx= 5 , pady= 5, columnspan= 2)
#Hauptteildefinitionen
def information():
ausgewählt = namenbox.curselection()
if len(ausgewählt) == 0:
info1.config(text = "Wählen sie zuerste einen Spieler aus! (Klicken)")
else:
info1.config(text = "Sie haben " + str(listeNamen[int(ausgewählt[0])] + " ausgewählt!"))
info2.config(text = "Geben Sie die gewünschte zu addierende Punktzahl ein:")
print(ausgewählt)
def hinzufügen():
ausgewählt = namenbox.curselection()
PlusPunktzahl = eingabe.get()
print(ausgewählt)
#Vorbeugung möglicher Fehler
if len(ausgewählt) == 0:
info1.config(text = "Wählen sie zuerste einen Spieler aus! (Klicken)")
elif PlusPunktzahl == "":
info1.config(text = "Unbedingt eine gültige Punktzahl eingeben!")
elif int(PlusPunktzahl) <= 0:
info1.config(text = "Unbedingt eine gültige Punktzahl eingeben!")
eingabe.delete(0, "end")
else:
print(PlusPunktzahl)
punktestand[int(ausgewählt[0])] += int(PlusPunktzahl)
punktebox.delete(int(ausgewählt[0]))
punktebox.insert(int(ausgewählt[0]), punktestand[int(ausgewählt[0])] )
eingabe.delete(0, "end")
info1.config(text = "")
print(punktestand)
def Uhrzeitschleife():
while not fenstergeschlossen:
UhrzeitLabel.config(text = datetime.now().strftime('%H:%M'))
time.sleep(60)
return
#Zerstörung des Labels + Schreiben in die Datei
def Ende():
if messagebox.askyesno('Sicher?','Wirklich beenden?'):
fenster.destroy()
global fenstergeschlossen
fenstergeschlossen = True
#Schreiben in die Datei
file = open("Punktezähler_Daten.txt", "w")
NamenslisteString = " ".join(listeNamen)
print(NamenslisteString)
PunkteListeString = " ".join(map(str,punktestand))
file.write(NamenslisteString + "\n")
file.write(PunkteListeString + "\n")
file.write(str(HeuteDatum))
file.close
else:
pass
#Ende der Definitionen
#Bauteile erstellen
DatumsLabel = Label(fenster, text = date.today().strftime("%d.%m.%Y"), justify=RIGHT)
UhrzeitLabel = Label(fenster, text = datetime.now().strftime('%H:%M'))
WillkommensLabel = Label(fenster, text = "Herzlich willkommen zum epischen Punktezähler! ")
namenbox = Listbox(fenster, highlightcolor = "red")
punktebox = Listbox(fenster, highlightcolor = "red")
info1 = Label(fenster, text = "Daten vom: " + datum + " verwenden?")
info2 = Label(fenster, text = "Ja/Nein ")
Button1 = Button(fenster, text = "Ja!", command = ja)
Button2 = Button(fenster, text = "Nein!", command = nein)
Button3 = Button(fenster, text = "Hinzufügen\nbeenden!", command = HinzufügenBeenden)
eingabe = Entry(fenster)
ende = Button(fenster, text = "Beenden", command = Ende)
#Bauteile packen
DatumsLabel.grid(row = 0, column = 1, padx= 5 , pady= 5)
UhrzeitLabel.grid(row = 0, column = 0, padx= 5 , pady= 5)
WillkommensLabel.grid(row = 1, column = 0, columnspan= 2, padx= 5 , pady= 5)
namenbox.grid(row = 2, column = 0, padx= 5 , pady= 5)
punktebox.grid(row = 2, column = 1, padx= 5 , pady= 5)
Button1.grid(row= 3, column = 0, padx= 5 , pady= 5)
Button2.grid(row = 3, column = 1, padx= 5 , pady= 5)
info1.grid(row= 4, column = 0, padx= 5 , pady= 5, columnspan= 2)
info2.grid(row = 5, column = 0, padx= 5 , pady= 5, columnspan = 2)
ende.grid(row = 7, column = 0, padx= 5 , pady= 5, columnspan= 2)
#Listboxen befüllen
for name in listeNamen:
namenbox.insert("end", name)
for punkte in punktestand:
punktebox.insert("end", punkte)
#Uhrzeit aktualisieren
U = threading.Thread(target = Uhrzeitschleife)
U.start()
#Fenster starten
fenster.mainloop()
Um noch Verständisfragen bezüglich meines Programmes zu klären: Das Programm speichert die Spieler und dessen Punktezahl fürs nächste Benutzen. Wenn sie das Programm ausprobieren wollen, müssen sie noch schnell ein Textdokument anlegen oder es auskommentieren!