In diesem Artikel werden wir eine Anwendung entwickeln, die Python verwendet. Die Standardbibliothek tkinter wird als GUI-Bibliothek verwendet. Wenn Sie Python bis zu einem gewissen Grad verstehen, indem Sie diesen Artikel lesen, können Sie lernen, wie Sie tkinter bis zu einem gewissen Grad verwenden.
Es ist eine der Standard-Python-Bibliotheken. Eine Bibliothek zum Erstellen von GUI-Anwendungen. Eine GUI-Bibliothek mit einfacher Grammatik und schnellem Start.
Zuerst erstellen wir das Basisfenster.
import tkinter as tk
if __name__ == "__main__":
root = tk.Tk()
root.mainloop()
Als Nächstes erstellen wir eine Klasse, die die Frame-Klasse erbt, um unter Berücksichtigung der Objektorientierung zu schreiben. Erstellen Sie die erforderlichen Teile (Widgets) in create_widgets (), ordnen Sie sie an und erstellen Sie den Bildschirm.
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack()
master.geometry("300x200")
master.title("Tippspiel!")
self.create_widgets()
#Widgets generieren und platzieren
def create_widgets(self):
self.q_label = tk.Label(self, text="Thema:", font=("",20))
self.q_label.grid(row=0, column=0)
self.q_label2 = tk.Label(self, text="tkinter", width=5, anchor="w", font=("",20))
self.q_label2.grid(row=0, column=1)
self.ans_label = tk.Label(self, text="Antworten:", font=("",20))
self.ans_label.grid(row=1, column=0)
self.ans_label2 = tk.Label(self, text="tkinter", width=5, anchor="w", font=("",20))
self.ans_label2.grid(row=1, column=1)
self.result_label = tk.Label(self, text="Richtig / falsches Etikett", font=("",20))
self.result_label.grid(row=2, column=0, columnspan=2)
if __name__ == "__main__":
root = tk.Tk()
Application(master=root)
root.mainloop()
Als Nächstes erstellen wir den Teil zur Verarbeitung der Schlüsseleingabe. Implementieren Sie zunächst den Vorgang des Hinzufügens eines Werts zur Antwortspalte, wenn ein Zeichen eingegeben wird.
Lassen Sie zunächst den Anfangswert der Antwortspalte leer.
self.ans_label2 = tk.Label(self, text="", width=5, anchor="w", font=("",20))
Erstellen Sie als Nächstes eine Methode für die Ereignisverarbeitung zum Zeitpunkt der Schlüsseleingabe. Die eingegebenen Schlüsselinformationen werden in event.keysym gespeichert. Wenn Sie beispielsweise die A-Taste drücken, werden die Informationen "a" gespeichert.
#Ereignisverarbeitung zum Zeitpunkt der Tasteneingabe
def type_event(self, event):
self.ans_label2["text"] += event.keysym
Verwenden Sie bind (), um den zuletzt erstellten Ereignisprozess einer Instanz der Tk-Klasse zuzuordnen.
#Implementierung von Schlüsselereignissen für Tk-Instanzen implementiert
self.master.bind("<KeyPress>", self.click_event)
Die Zusammenfassung bis zu diesem Punkt ist wie folgt.
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack()
master.geometry("300x200")
master.title("Tippspiel!")
self.create_widgets()
#Implementierung von Schlüsselereignissen für Tk-Instanzen implementiert
self.master.bind("<KeyPress>", self.type_event)
#Widgets generieren und platzieren
def create_widgets(self):
self.q_label = tk.Label(self, text="Thema:", font=("",20))
self.q_label.grid(row=0, column=0)
self.q_label2 = tk.Label(self, text="tkinter", width=5, anchor="w", font=("",20))
self.q_label2.grid(row=0, column=1)
self.ans_label = tk.Label(self, text="Antworten:", font=("",20))
self.ans_label.grid(row=1, column=0)
self.ans_label2 = tk.Label(self, text="", width=5, anchor="w", font=("",20))
self.ans_label2.grid(row=1, column=1)
self.result_label = tk.Label(self, text="Richtig / falsches Etikett", font=("",20))
self.result_label.grid(row=2, column=0, columnspan=2)
#Ereignisverarbeitung zum Zeitpunkt der Tasteneingabe
def type_event(self, event):
self.ans_label2["text"] += event.keysym
if __name__ == "__main__":
root = tk.Tk()
Application(master=root)
root.mainloop()
Dieses Mal erstellen wir es mit der Spezifikation, dass die richtige Antwort beurteilt wird, wenn Sie die "Eingabetaste" drücken. Die Beurteilung des eingegebenen Schlüssels erfolgt anhand des Wertes von event.keysym. Wenn Sie die "Eingabetaste" drücken, wird "Return" in event.keysym gespeichert, sodass es nach if beurteilt wird. "Keysym" ist übrigens eine Abkürzung für "Keysymbol".
#Ereignisverarbeitung zum Zeitpunkt der Tasteneingabe
def type_event(self, event):
#Wenn der Eingabewert Enter ist, antworten Sie zusammen
if event.keysym == "Return":
if self.q_label2["text"] == self.ans_label2["text"]:
self.result_label.configure(text="Richtige Antwort!", fg="red")
else:
self.result_label.configure(text="Es tut uns leid!", fg="blue")
#Löschen Sie die Antwortspalte
self.ans_label2.configure(text="")
else:
#Wenn der Eingabewert nicht Enter ist, fügen Sie ihn als Zeicheneingabe zur Beschriftung hinzu
self.ans_label2["text"] += event.keysym
Implementieren Sie die Funktion, um nach dem Bestanden / Nicht Bestanden-Urteil mit dem nächsten Problem fortzufahren.
Erstellen Sie zunächst eine Liste mit Problemen.
QUESTION = ["tkinter", "geometry", "widgets", "messagebox", "configure",
"label", "column", "rowspan", "grid", "init"]
Bereiten Sie als Nächstes eine Variable für den Index vor, die die Anzahl der Probleme im Konstruktor verwaltet.
#Problemnummernindex
self.index = 0
Fügen Sie abschließend den Vorgang zum Umschreiben des Beschriftungswerts zum nächsten Problem im Ereignisprozess hinzu.
#Stellen Sie die nächste Frage
self.index += 1
self.q_label2.configure(text=QUESTION[self.index])
Die Zusammenfassung bis zu diesem Punkt ist wie folgt.
import tkinter as tk
QUESTION = ["tkinter", "geometry", "widgets", "messagebox", "configure",
"label", "column", "rowspan", "grid", "init"]
class Application(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack()
master.geometry("300x200")
master.title("Tippspiel!")
#Problemnummernindex
self.index = 0
self.create_widgets()
#Implementierung von Schlüsselereignissen für Tk-Instanzen implementiert
self.master.bind("<KeyPress>", self.type_event)
#Widgets generieren und platzieren
def create_widgets(self):
self.q_label = tk.Label(self, text="Thema:", font=("",20))
self.q_label.grid(row=0, column=0)
self.q_label2 = tk.Label(self, text=QUESTION[self.index], width=10, anchor="w", font=("",20))
self.q_label2.grid(row=0, column=1)
self.ans_label = tk.Label(self, text="Antworten:", font=("",20))
self.ans_label.grid(row=1, column=0)
self.ans_label2 = tk.Label(self, text="", width=10, anchor="w", font=("",20))
self.ans_label2.grid(row=1, column=1)
self.result_label = tk.Label(self, text="Richtig / falsches Etikett", font=("",20))
self.result_label.grid(row=2, column=0, columnspan=2)
#Ereignisverarbeitung zum Zeitpunkt der Tasteneingabe
def type_event(self, event):
#Wenn der Eingabewert Enter ist, antworten Sie zusammen
if event.keysym == "Return":
if self.q_label2["text"] == self.ans_label2["text"]:
self.result_label.configure(text="Richtige Antwort!", fg="red")
else:
self.result_label.configure(text="Es tut uns leid!", fg="blue")
#Löschen Sie die Antwortspalte
self.ans_label2.configure(text="")
#Stellen Sie die nächste Frage
self.index += 1
self.q_label2.configure(text=QUESTION[self.index])
else:
#Wenn der Eingabewert nicht Enter ist, fügen Sie ihn als Zeicheneingabe zur Beschriftung hinzu
self.ans_label2["text"] += event.keysym
if __name__ == "__main__":
root = tk.Tk()
Application(master=root)
root.mainloop()
Als nächstes implementieren wir die Rücktaste. Implementieren Sie dies, indem Sie einen Zweig hinzufügen, wenn event.keysym "BackSpace" ist.
#Ereignisverarbeitung zum Zeitpunkt der Tasteneingabe
def type_event(self, event):
#Wenn der Eingabewert Enter ist, antworten Sie zusammen
if event.keysym == "Return":
if self.q_label2["text"] == self.ans_label2["text"]:
self.result_label.configure(text="Richtige Antwort!", fg="red")
else:
self.result_label.configure(text="Es tut uns leid!", fg="blue")
#Löschen Sie die Antwortspalte
self.ans_label2.configure(text="")
#Stellen Sie die nächste Frage
self.index += 1
self.q_label2.configure(text=QUESTION[self.index])
elif event.keysym == "BackSpace":
text = self.ans_label2["text"]
self.ans_label2["text"] = text[:-1]
else:
#Wenn der Eingabewert nicht Enter ist, fügen Sie ihn als Zeicheneingabe zur Beschriftung hinzu
self.ans_label2["text"] += event.keysym
Implementieren Sie die Funktion, um das Ergebnis anzuzeigen, nachdem Sie bis zum Ende geantwortet haben. Die Ergebnisse werden in einem Popup-Fenster angezeigt. Auch dieses Mal werden wir die Spezifikation so vornehmen, dass die Anwendung gleichzeitig mit dem Schließen des Popups gewaltsam beendet wird.
Um den obigen Prozess zu implementieren, importieren Sie zuerst die beiden Bibliotheken.
from tkinter import messagebox
import sys
Bereiten Sie außerdem eine Variable vor, um die Anzahl der richtigen Antworten zu zählen. Lassen Sie uns dies im Konstruktor initialisieren.
#Zum Zählen der Anzahl der richtigen Antworten
self.correct_cnt = 0
Fahren Sie abschließend mit dem nächsten Problem im Ereignisprozess fort, um festzustellen, ob Sie das Ende des Problems erreicht haben, und rufen Sie den Prozess auf, um das Ergebnis-Popup (Meldungsfeld) anzuzeigen. sys.exit (0) ist eine Methode zum Beenden eines Programms.
#Stellen Sie die nächste Frage
self.index += 1
if self.index == len(QUESTION):
self.q_label2.configure(text="Fertig!")
messagebox.showinfo("Ergebnis", f"Dein Ergebnis ist{self.correct_cnt}/{self.index}Die Frage ist richtig.")
sys.exit(0)
self.q_label2.configure(text=QUESTION[self.index])
Die Zusammenfassung bis zu diesem Punkt ist wie folgt.
import tkinter as tk
from tkinter import messagebox
import sys
QUESTION = ["tkinter", "geometry", "widgets", "messagebox", "configure",
"label", "column", "rowspan", "grid", "init"]
class Application(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack()
master.geometry("300x200")
master.title("Tippspiel!")
#Problemnummernindex
self.index = 0
#Zum Zählen der Anzahl der richtigen Antworten
self.correct_cnt = 0
self.create_widgets()
#Implementierung von Schlüsselereignissen für Tk-Instanzen implementiert
self.master.bind("<KeyPress>", self.type_event)
#Widgets generieren und platzieren
def create_widgets(self):
self.q_label = tk.Label(self, text="Thema:", font=("",20))
self.q_label.grid(row=0, column=0)
self.q_label2 = tk.Label(self, text=QUESTION[self.index], width=10, anchor="w", font=("",20))
self.q_label2.grid(row=0, column=1)
self.ans_label = tk.Label(self, text="Antworten:", font=("",20))
self.ans_label.grid(row=1, column=0)
self.ans_label2 = tk.Label(self, text="", width=10, anchor="w", font=("",20))
self.ans_label2.grid(row=1, column=1)
self.result_label = tk.Label(self, text="", font=("",20))
self.result_label.grid(row=2, column=0, columnspan=2)
#Ereignisverarbeitung zum Zeitpunkt der Tasteneingabe
def type_event(self, event):
#Wenn der Eingabewert Enter ist, antworten Sie zusammen
if event.keysym == "Return":
if self.q_label2["text"] == self.ans_label2["text"]:
self.result_label.configure(text="Richtige Antwort!", fg="red")
self.correct_cnt += 1
else:
self.result_label.configure(text="Es tut uns leid!", fg="blue")
#Löschen Sie die Antwortspalte
self.ans_label2.configure(text="")
#Stellen Sie die nächste Frage
self.index += 1
if self.index == len(QUESTION):
self.q_label2.configure(text="Fertig!")
messagebox.showinfo("Ergebnis", f"Dein Ergebnis ist{self.correct_cnt}/{self.index}Die Frage ist richtig.")
sys.exit(0)
self.q_label2.configure(text=QUESTION[self.index])
elif event.keysym == "BackSpace":
text = self.ans_label2["text"]
self.ans_label2["text"] = text[:-1]
else:
#Wenn der Eingabewert nicht Enter ist, fügen Sie ihn als Zeicheneingabe zur Beschriftung hinzu
self.ans_label2["text"] += event.keysym
if __name__ == "__main__":
root = tk.Tk()
Application(master=root)
root.mainloop()
Ich denke, dass die Grundfunktionen implementiert wurden. Das Ausführungsergebnis ist wie folgt.
Wenn Sie die Zeit mithilfe der Multithread-Verarbeitung in Echtzeit messen können, ist dies ein Bonus.
Der Quellcode lautet wie folgt.
import tkinter as tk
from tkinter import messagebox
import sys
import time
import threading
QUESTION = ["tkinter", "geometry", "widgets", "messagebox", "configure",
"label", "column", "rowspan", "grid", "init"]
class Application(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack()
master.geometry("300x200")
master.title("Tippspiel!")
#Problemnummernindex
self.index = 0
#Zum Zählen der Anzahl der richtigen Antworten
self.correct_cnt = 0
self.create_widgets()
#Verstrichene Zeit Thread-Start
t = threading.Thread(target=self.timer)
t.start()
#Implementierung von Schlüsselereignissen für Tk-Instanzen implementiert
self.master.bind("<KeyPress>", self.type_event)
#Widgets generieren und platzieren
def create_widgets(self):
self.q_label = tk.Label(self, text="Thema:", font=("",20))
self.q_label.grid(row=0, column=0)
self.q_label2 = tk.Label(self, text=QUESTION[self.index], width=10, anchor="w", font=("",20))
self.q_label2.grid(row=0, column=1)
self.ans_label = tk.Label(self, text="Antworten:", font=("",20))
self.ans_label.grid(row=1, column=0)
self.ans_label2 = tk.Label(self, text="", width=10, anchor="w", font=("",20))
self.ans_label2.grid(row=1, column=1)
self.result_label = tk.Label(self, text="", font=("",20))
self.result_label.grid(row=2, column=0, columnspan=2)
# #Etikett zur Zeitmessung
self.time_label = tk.Label(self, text="", font=("",20))
self.time_label.grid(row=3, column=0, columnspan=2)
self.flg2 = True
#Ereignisverarbeitung zum Zeitpunkt der Tasteneingabe
def type_event(self, event):
#Wenn der Eingabewert Enter ist, antworten Sie zusammen
if event.keysym == "Return":
if self.q_label2["text"] == self.ans_label2["text"]:
self.result_label.configure(text="Richtige Antwort!", fg="red")
self.correct_cnt += 1
else:
self.result_label.configure(text="Es tut uns leid!", fg="blue")
#Löschen Sie die Antwortspalte
self.ans_label2.configure(text="")
#Stellen Sie die nächste Frage
self.index += 1
if self.index == len(QUESTION):
self.flg = False
self.q_label2.configure(text="Fertig!")
messagebox.showinfo("Ergebnis", f"Dein Ergebnis ist{self.correct_cnt}/{self.index}Die Frage ist richtig.\n Zeit löschen{self.second}Sekunden.")
sys.exit(0)
self.q_label2.configure(text=QUESTION[self.index])
elif event.keysym == "BackSpace":
text = self.ans_label2["text"]
self.ans_label2["text"] = text[:-1]
else:
#Wenn der Eingabewert nicht Enter ist, fügen Sie ihn als Zeicheneingabe zur Beschriftung hinzu
self.ans_label2["text"] += event.keysym
def timer(self):
self.second = 0
self.flg = True
while self.flg:
self.second += 1
self.time_label.configure(text=f"verstrichene Zeit:{self.second}Sekunden")
time.sleep(1)
if __name__ == "__main__":
root = tk.Tk()
Application(master=root)
root.mainloop()
Recommended Posts