J'ai fait un jeu de frappe simple avec tkinter de Python

introduction

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.

Qu'est-ce que Tkinter

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.

Créer une fenêtre

Commençons par créer la fenêtre de base.

import tkinter as tk

if __name__ == "__main__":
    root = tk.Tk()
    root.mainloop()

01_ウィンドウ.png

Créer un écran

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()

01.ウィジェット配置.png

Paramètres de traitement des événements de frappe

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()

02_イベント処理実装.gif

Mise en œuvre du processus d'appariement des réponses

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

03_正否判定処理.gif

Mise en œuvre de la fonction de question continue

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()

04_連続解答.gif

Implémentation de la fonction de retour arrière

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

05_バックスペース機能.gif

Implémentation de la fonction d'affichage des résultats

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. 06_基本機能完成.gif

Bonus (traitement de la mesure du temps supplémentaire utilisant le traitement multi-thread)

En prime, si vous pouvez mesurer le temps en temps réel à l'aide d'un traitement multi-thread, ce sera comme suit.

07_タイム計測機能実装.gif

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

J'ai fait un jeu de frappe simple avec tkinter de Python
J'ai fait un jeu de puzzle (comme) avec Tkinter of Python
J'ai fait un jeu rogue-like avec Python
J'ai fait un simple blackjack avec Python
J'ai essayé de jouer à un jeu de frappe avec Python
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
J'ai fait un jeu de cueillette avec Python
J'ai fait un jeu d'éclairage de sapin de Noël avec Python
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
J'ai créé une application de livre simple avec python + Flask ~ Introduction ~
J'ai fait un programme de gestion de la paie en Python!
J'ai fait un compteur de caractères avec Python
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu de vie avec Numpy
J'ai créé un fichier de configuration avec Python
J'ai fait un simulateur de neurones avec Python
Jeu de vie avec Python [je l'ai fait] (sur terminal et Tkinter)
J'ai fait un circuit simple avec Python (AND, OR, NOR, etc.)
〇✕ J'ai fait un jeu
[Python] J'ai créé une visionneuse d'images avec une fonction de tri simple.
J'ai créé un chat-holdem de serveur de jeu de poker en utilisant websocket avec python
J'ai fait une prévision météo de type bot avec Python.
J'ai créé une application graphique avec Python + PyQt5
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
Je veux faire un jeu avec Python
J'ai fait un simple portefeuille de Bitcoin avec pycoin
J'ai créé un programme cryptographique César en Python.
Made Mattermost Bot avec Python (+ Flask)
J'ai fait un blackjack avec du python!
J'ai fait un texte Python
Jeu de frappe simple avec DragonRuby
J'ai fait un blackjack avec Python.
J'ai créé wordcloud avec Python.
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
J'ai créé une fenêtre pour la sortie du journal avec Tkinter
Créez un Slackbot simple avec un bouton interactif en python
J'ai créé une application de notification de nouvelles en ligne avec Python
Essayez de créer un jeu simple avec Python 3 et iPhone
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
Je veux travailler avec un robot en python.
J'ai essayé de faire LINE BOT avec Python et Heroku
J'ai fait un jeu mono tombé avec Sense HAT
J'ai fait une application d'envoi de courrier simple avec tkinter de Python
J'ai fait un Line-bot avec Python!
J'ai créé un package pour filtrer les séries chronologiques avec python
Numer0n avec des objets fabriqués avec Python
J'ai créé un lecteur de flux rapide en utilisant feedparser en Python
J'ai fait un jeu de combat Numer0n en Java (j'ai aussi fait de l'IA)
Développement de jeux Othello avec Python
J'ai créé une classe en Python et essayé de taper du canard
Implémentation d'un algorithme simple en Python 2
J'ai fait un chronomètre en utilisant tkinter avec python
Exécutez un algorithme simple en Python