Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht

Einführung

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.

Was ist Tkinter?

Es ist eine der Standard-Python-Bibliotheken. Eine Bibliothek zum Erstellen von GUI-Anwendungen. Eine GUI-Bibliothek mit einfacher Grammatik und schnellem Start.

Ein Fenster erstellen

Zuerst erstellen wir das Basisfenster.

import tkinter as tk

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

01_ウィンドウ.png

Bildschirm erstellen

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

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

Einstellungen für die Verarbeitung von Tastenanschlagereignissen

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

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

Implementierung des Antwortabgleichprozesses

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

03_正否判定処理.gif

Implementierung einer kontinuierlichen Fragenfunktion

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

04_連続解答.gif

Implementierung der Rücktaste

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

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

Implementierung der Ergebnisanzeigefunktion

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

Bonus (zusätzliche Zeitmessungsverarbeitung mit Multithread-Verarbeitung)

Wenn Sie die Zeit mithilfe der Multithread-Verarbeitung in Echtzeit messen können, ist dies ein Bonus.

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

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

Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht
Ich habe mit Tkinter of Python ein Puzzlespiel (wie) gemacht
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe versucht, mit Python ein Tippspiel zu spielen
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
Ich habe mit Python ein Bin-Picking-Spiel gemacht
Ich habe mit Python ein Weihnachtsbaum-Beleuchtungsspiel gemacht
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python einen Daemon erstellt
Ich habe eine einfache Buch-App mit Python + Flask ~ Introduction ~ erstellt
Ich habe ein Pay-Management-Programm in Python erstellt!
Ich habe mit Python einen Zeichenzähler erstellt
Ich habe mit Python eine Hex-Map erstellt
Ich habe ein Lebensspiel mit Numpy gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe mit Python einen Neuronensimulator erstellt
Lebensspiel mit Python [ich habe es geschafft] (auf Terminal & Tkinter)
Ich habe eine einfache Schaltung mit Python gemacht (AND, OR, NOR, etc.)
〇✕ Ich habe ein Spiel gemacht
[Python] Ich habe einen Bildbetrachter mit einer einfachen Sortierfunktion erstellt.
Ich habe einen Pokerspielserver Chat-Holdem mit Websocket mit Python erstellt
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
Ich möchte ein Spiel mit Python machen
Ich habe eine einfache Brieftasche aus Bitcoin mit Pycoin gemacht
Ich habe ein Caesar-Kryptografieprogramm in Python erstellt.
Mattermost Bot mit Python gemacht (+ Flask)
Ich habe einen Blackjack mit Python gemacht!
Ich habe einen Python-Text gemacht
Einfaches Tippspiel mit DragonRuby
Ich habe mit Python einen Blackjack gemacht.
Ich habe Wordcloud mit Python gemacht.
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
Ich habe mit Tkinter ein Fenster für die Protokollausgabe erstellt
Erstellen Sie einen einfachen Slackbot mit einer interaktiven Schaltfläche in Python
Ich habe mit Python eine App für die Benachrichtigung über Netznachrichten erstellt
Versuchen Sie, ein einfaches Spiel mit Python 3 und iPhone zu erstellen
Ich habe eine Python3-Umgebung unter Ubuntu mit direnv erstellt.
Ich möchte mit einem Roboter in Python arbeiten.
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Ich habe mit Sense HAT ein gefallenes Monospiel gemacht
Ich habe eine einfache Mail-Sendeanwendung mit tkinter von Python erstellt
Ich habe einen Line-Bot mit Python gemacht!
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Numer0n mit Elementen, die mit Python erstellt wurden
Ich habe einen schnellen Feed-Reader mit Feedparser in Python erstellt
Ich habe ein Numer0n-Kampfspiel in Java gemacht (ich habe auch KI gemacht)
Othello-Spieleentwicklung mit Python
Ich habe eine Klasse in Python erstellt und versucht, Enten zu tippen
Implementierung eines einfachen Algorithmus in Python 2
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Führen Sie einen einfachen Algorithmus in Python aus