Dans cet article, nous développerons une application utilisant Python. La bibliothèque standard tkinter est utilisée comme bibliothèque GUI. Si vous comprenez python dans une certaine mesure en lisant cet article, vous pouvez apprendre à utiliser tkinter dans une certaine mesure.
C'est l'une des bibliothèques Python standard. Une bibliothèque pour créer des applications GUI. Une bibliothèque GUI avec une grammaire simple et un démarrage rapide.
Commençons par créer la fenêtre de base.
import tkinter as tk
if __name__ == "__main__":
root = tk.Tk()
root.mainloop()
Ensuite, nous allons créer une classe qui hérite de la classe Frame afin d'écrire avec l'orientation objet à l'esprit. Créez les éléments nécessaires (widgets) dans create_widgets (), organisez-les et créez l'écran.
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack()
master.geometry("300x200")
master.title("Jeu de frappe!")
self.create_widgets()
#Générer et placer des widgets
def create_widgets(self):
self.q_label = tk.Label(self, text="thème:", 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="répondre:", 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="Étiquette bonne / mauvaise", font=("",20))
self.result_label.grid(row=2, column=0, columnspan=2)
if __name__ == "__main__":
root = tk.Tk()
Application(master=root)
root.mainloop()
Ensuite, nous allons créer la partie de traitement des entrées clés. Tout d'abord, implémentez le processus d'ajout d'une valeur à la colonne de réponse lorsqu'un caractère est saisi.
Tout d'abord, laissez la valeur initiale de la colonne de réponse vide.
self.ans_label2 = tk.Label(self, text="", width=5, anchor="w", font=("",20))
Ensuite, créez une méthode pour le traitement des événements au moment de l'entrée de clé. Les informations de clé saisies sont stockées dans event.keysym. Par exemple, lorsque vous appuyez sur la touche A, les informations «a» sont enregistrées.
#Traitement des événements au moment de la saisie de la clé
def type_event(self, event):
self.ans_label2["text"] += event.keysym
Utilisez bind () pour associer le dernier processus événementiel créé à une instance de la classe Tk.
#Implémentation de la gestion des événements clés pour les instances Tk
self.master.bind("<KeyPress>", self.click_event)
Le résumé jusqu'à ce point est le suivant.
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack()
master.geometry("300x200")
master.title("Jeu de frappe!")
self.create_widgets()
#Implémentation de la gestion des événements clés pour les instances Tk
self.master.bind("<KeyPress>", self.type_event)
#Générer et placer des widgets
def create_widgets(self):
self.q_label = tk.Label(self, text="thème:", 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="répondre:", 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="Étiquette bonne / mauvaise", font=("",20))
self.result_label.grid(row=2, column=0, columnspan=2)
#Traitement des événements au moment de la saisie de la clé
def type_event(self, event):
self.ans_label2["text"] += event.keysym
if __name__ == "__main__":
root = tk.Tk()
Application(master=root)
root.mainloop()
Cette fois, nous le créerons avec la spécification que si vous appuyez sur la touche "Entrée", la réponse correcte sera jugée. Le jugement de la clé saisie est effectué en utilisant la valeur de event.keysym. Lorsque vous appuyez sur la touche "Entrée", "Retour" est stocké dans event.keysym, il est donc jugé par if. Au fait, "keysym" est une abréviation de "key symbol".
#Traitement des événements au moment de la saisie de la clé
def type_event(self, event):
#Si la valeur d'entrée est Enter, répondez ensemble
if event.keysym == "Return":
if self.q_label2["text"] == self.ans_label2["text"]:
self.result_label.configure(text="Bonne réponse!", fg="red")
else:
self.result_label.configure(text="Pardon!", fg="blue")
#Effacer la colonne de réponse
self.ans_label2.configure(text="")
else:
#Si la valeur d'entrée est différente de Enter, ajoutez-la à l'étiquette comme entrée de caractère
self.ans_label2["text"] += event.keysym
Implémentez la fonction pour passer au problème suivant après le jugement réussite / échec.
Commencez par créer une liste de problèmes.
QUESTION = ["tkinter", "geometry", "widgets", "messagebox", "configure",
"label", "column", "rowspan", "grid", "init"]
Ensuite, préparez une variable pour index qui gère le nombre de problèmes dans le constructeur.
#Index des numéros de problèmes
self.index = 0
Enfin, ajoutez le processus de réécriture de la valeur d'étiquette au problème suivant dans le processus d'événement.
#Posez la question suivante
self.index += 1
self.q_label2.configure(text=QUESTION[self.index])
Le résumé jusqu'à ce point est le suivant.
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("Jeu de frappe!")
#Index des numéros de problèmes
self.index = 0
self.create_widgets()
#Implémentation de la gestion des événements clés pour les instances Tk
self.master.bind("<KeyPress>", self.type_event)
#Générer et placer des widgets
def create_widgets(self):
self.q_label = tk.Label(self, text="thème:", 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="répondre:", 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="Étiquette bonne / mauvaise", font=("",20))
self.result_label.grid(row=2, column=0, columnspan=2)
#Traitement des événements au moment de la saisie de la clé
def type_event(self, event):
#Si la valeur d'entrée est Enter, répondez ensemble
if event.keysym == "Return":
if self.q_label2["text"] == self.ans_label2["text"]:
self.result_label.configure(text="Bonne réponse!", fg="red")
else:
self.result_label.configure(text="Pardon!", fg="blue")
#Effacer la colonne de réponse
self.ans_label2.configure(text="")
#Posez la question suivante
self.index += 1
self.q_label2.configure(text=QUESTION[self.index])
else:
#Si la valeur d'entrée est différente de Enter, ajoutez-la à l'étiquette comme entrée de caractère
self.ans_label2["text"] += event.keysym
if __name__ == "__main__":
root = tk.Tk()
Application(master=root)
root.mainloop()
Ensuite, nous implémenterons la fonction de retour arrière. Implémentez en ajoutant une branche lorsque event.keysym est "BackSpace".
#Traitement des événements au moment de la saisie de la clé
def type_event(self, event):
#Si la valeur d'entrée est Enter, répondez ensemble
if event.keysym == "Return":
if self.q_label2["text"] == self.ans_label2["text"]:
self.result_label.configure(text="Bonne réponse!", fg="red")
else:
self.result_label.configure(text="Pardon!", fg="blue")
#Effacer la colonne de réponse
self.ans_label2.configure(text="")
#Posez la question suivante
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:
#Si la valeur d'entrée est différente de Enter, ajoutez-la à l'étiquette comme entrée de caractère
self.ans_label2["text"] += event.keysym
Implémentez la fonction pour afficher le résultat après avoir répondu jusqu'à la fin. Les résultats sont affichés dans une fenêtre contextuelle. De plus, cette fois, nous allons faire la spécification pour que l'application soit arrêtée de force en même temps que la fermeture de la fenêtre contextuelle.
Pour implémenter le processus ci-dessus, importez d'abord les deux bibliothèques.
from tkinter import messagebox
import sys
Préparez également une variable pour compter le nombre de réponses correctes. Initialisons ceci dans le constructeur.
#Pour compter le nombre de bonnes réponses
self.correct_cnt = 0
Enfin, passez au problème suivant dans le processus d'événement pour déterminer si vous avez atteint la fin du problème et appelez le processus pour afficher la fenêtre contextuelle de résultat (boîte de message). sys.exit (0) est une méthode pour tuer un programme.
#Posez la question suivante
self.index += 1
if self.index == len(QUESTION):
self.q_label2.configure(text="Fini!")
messagebox.showinfo("résultat", f"Ton score est{self.correct_cnt}/{self.index}La question est correcte.")
sys.exit(0)
self.q_label2.configure(text=QUESTION[self.index])
Le résumé jusqu'à ce point est le suivant.
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("Jeu de frappe!")
#Index des numéros de problèmes
self.index = 0
#Pour compter le nombre de bonnes réponses
self.correct_cnt = 0
self.create_widgets()
#Implémentation de la gestion des événements clés pour les instances Tk
self.master.bind("<KeyPress>", self.type_event)
#Générer et placer des widgets
def create_widgets(self):
self.q_label = tk.Label(self, text="thème:", 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="répondre:", 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)
#Traitement des événements au moment de la saisie de la clé
def type_event(self, event):
#Si la valeur d'entrée est Enter, répondez ensemble
if event.keysym == "Return":
if self.q_label2["text"] == self.ans_label2["text"]:
self.result_label.configure(text="Bonne réponse!", fg="red")
self.correct_cnt += 1
else:
self.result_label.configure(text="Pardon!", fg="blue")
#Effacer la colonne de réponse
self.ans_label2.configure(text="")
#Posez la question suivante
self.index += 1
if self.index == len(QUESTION):
self.q_label2.configure(text="Fini!")
messagebox.showinfo("résultat", f"Ton score est{self.correct_cnt}/{self.index}La question est correcte.")
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:
#Si la valeur d'entrée est différente de Enter, ajoutez-la à l'étiquette comme entrée de caractère
self.ans_label2["text"] += event.keysym
if __name__ == "__main__":
root = tk.Tk()
Application(master=root)
root.mainloop()
Je pense que les fonctions de base ont été implémentées. Le résultat de l'exécution est le suivant.
En prime, si vous pouvez mesurer le temps en temps réel à l'aide d'un traitement multi-thread, ce sera comme suit.
Le code source est le suivant.
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("Jeu de frappe!")
#Index des numéros de problèmes
self.index = 0
#Pour compter le nombre de bonnes réponses
self.correct_cnt = 0
self.create_widgets()
#Début du fil de temps écoulé
t = threading.Thread(target=self.timer)
t.start()
#Implémentation de la gestion des événements clés pour les instances Tk
self.master.bind("<KeyPress>", self.type_event)
#Générer et placer des widgets
def create_widgets(self):
self.q_label = tk.Label(self, text="thème:", 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="répondre:", 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)
# #Étiquette pour la mesure du temps
self.time_label = tk.Label(self, text="", font=("",20))
self.time_label.grid(row=3, column=0, columnspan=2)
self.flg2 = True
#Traitement des événements au moment de la saisie de la clé
def type_event(self, event):
#Si la valeur d'entrée est Enter, répondez ensemble
if event.keysym == "Return":
if self.q_label2["text"] == self.ans_label2["text"]:
self.result_label.configure(text="Bonne réponse!", fg="red")
self.correct_cnt += 1
else:
self.result_label.configure(text="Pardon!", fg="blue")
#Effacer la colonne de réponse
self.ans_label2.configure(text="")
#Posez la question suivante
self.index += 1
if self.index == len(QUESTION):
self.flg = False
self.q_label2.configure(text="Fini!")
messagebox.showinfo("résultat", f"Ton score est{self.correct_cnt}/{self.index}La question est correcte.\n Temps clair{self.second}Secondes.")
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:
#Si la valeur d'entrée est différente de Enter, ajoutez-la à l'étiquette comme entrée de caractère
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"temps écoulé:{self.second}Secondes")
time.sleep(1)
if __name__ == "__main__":
root = tk.Tk()
Application(master=root)
root.mainloop()
Recommended Posts