[PYTHON] Iterative (rekursive) Verarbeitung mit tkinter (in der Reihenfolge angezeigt)

Goal Bei der ersten Verwendung von Pythons tkinter habe ich ein Programm erstellt, das englische Wörter in der angegebenen Reihenfolge anzeigt, und es daher aufgezeichnet.

Was ist tkinter?

Eine Bibliothek zum Generieren von GUI-Teilen usw. mit Python. Kann mit Homebrew installiert werden.

brew install tcl-tk

Wenn Sie pyenv verwenden, müssen Sie möglicherweise die Python-Version, die Sie verwenden möchten, deinstallieren-> neu installieren, nachdem Sie die oben genannten Schritte ausgeführt haben. Andernfalls habe ich nicht gearbeitet.

Iterative (rekursive) Verarbeitung

Wenn Sie im Internet suchen, finden Sie häufig Beispiele für die Implementierung von Count-up-Timern.

Dies wird realisiert, indem die Nummer innerhalb des angegebenen Etiketts (Zeichen oder Bereichsteil, der angezeigt werden soll) jede Sekunde geändert wird. In etwa sollten die folgenden Algorithmen und Funktionen verwendet werden.

class Timer
  def __init__(self):
    -Initialisierung der zu zählenden Variablen
    -Generieren Sie eine Beschriftung, um die Nummer des Timers anzuzeigen
    

  def count_up(label):
    -Zeigen Sie den Wert der Variablen an, die auf dem Etikett gezählt werden soll
    -Zählinkrement
    -1 Sekunde später zählen_up()Rufen Sie eine Funktion auf(Rekursiv) ---(*)

window = tkinter.Tk() #Fenstergenerierung
count_up_timer = Timer(window)
window.mainloop()

Verwenden Sie bei (*) die after () -Methode von tkinter. Rufen Sie die angegebene Funktion nach der angegebenen Zeit mit dem Namen auf, wie er ist.

Im Folgenden wird das Wort anstelle der Nummer angezeigt oder die Anzeige an einer bestimmten Stelle gestoppt.

Ein Programm, das die eingegebenen englischen Wörter der Reihe nach anzeigt

Was hast du gemacht

Der Grund, warum ich dies als Implementierungsthema gewählt habe, ist, dass ich eine Lese-App namens "Spritz" verwendet habe. Diese App liest englische Sätze auf der Webseite und zeigt sie Wort für Wort wie eine Flash-Berechnung an.

Klicken Sie hier für Spritz Aus dem Forschungsergebnis geht hervor, dass ein beträchtlicher Teil der zum Lesen eines Satzes erforderlichen Zeit für die Bewegung des Standpunkts aufgewendet wird. Es scheint, dass die Wörter an einer Stelle in der richtigen Reihenfolge angezeigt werden.

Kurz gesagt, ich habe diese Fälschung mit tkiner implementiert. (Die Hauptfamilie hat viele wissenschaftliche Ideen, wie zum Beispiel einen Buchstaben jedes Wortes rot zu machen, um die Übereinstimmung mit dem Standpunkt zu erleichtern.) Nun, es kann eine gute Praxis sein, die Neustartfunktion zu implementieren.

Implementierung

Ich habe die Funktion zum Lesen des Textes auf der Webseite aufgegeben und werde den Text in das Textfeld kopieren. Die Benutzeroberfläche sieht so aus.

tkinter_test.png

Wenn Sie die Start-Taste drücken,
Die Wörter im Satz im obigen Textfeld werden einzeln unter der Schaltfläche angezeigt. (Im Bild wird "Totoro" angezeigt.)

Code unten

# import tkinter 
try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk
import time

class Flash:
    def __init__(self, parent, wpm, words_list, label):
        # variable storing time
        self.count = 0
        # label displaying words
        self.wpm = wpm
        self.words_list = words_list
        # convert wpm to display interval in ms
        self.wpm_interval = int(60/self.wpm * 1000)
        self.label = label
        # self.label = tk.Label(parent, text="***", font="Arial 40", width=25)
        self.label.pack()

    def display_next_word(self):
        # finish the loop when all words are displayed
        if self.count > len(self.words_list)-1:
            self.count = 0
            self.label.destroy()
            return

        # display next word
        self.label.configure(text="%s" % self.words_list[self.count])
        # increment the count
        self.count += 1

        # let tkinter to call self.refresh after 1/wpm sec
        self.label.after(self.wpm_interval, self.display_next_word)
        

if __name__ == "__main__":

    # define a window
    root = tk.Tk()
    root.geometry("400x300")

    # label for english sentences
    label_text = tk.Label(root, text=u'sentences (copy and paste):')
    label_text.pack()

    # text box for english sentences
    text = tk.Entry(root)
    text.pack()
    text.insert(tk.END, 'My Neighbor Totoro') # initial value

    # label for wpm (word per minutes)
    label_wpm = tk.Label(root, text=u'wpm \n (how many words you read/understand in 1 minutes):')
    label_wpm.pack()

    # text box for wpm
    wpm_box = tk.Entry(root)
    wpm_box.pack()
    wpm_box.insert(tk.END, '250')

    
    def start_flash():
        # prepare label for displayin words one by one
        label_flash_words = tk.Label(root, text="***", font="Arial 40", width=25)
        
        # prepare sentences and wpm values
        target_text = text.get()
        print("the number of words : ", len(target_text.split()))
        wpm_int = int(wpm_box.get())
        
        # start flashing
        flash = Flash(root, wpm = wpm_int, words_list = target_text.split(), label=label_flash_words)
        flash.display_next_word()
    
    start_btn = tk.Button(root, text='start', command=start_flash)
    start_btn.pack()
    
    root.mainloop()

Die after-Methode selbst garantiert keine hohe Zeitgenauigkeit. Wenn Sie dies wünschen, müssen Sie sie separat ändern.

Abgesehen von der Nützlichkeit des Programms selbst habe ich etwas über tkinter gelernt.

Referenz

RIP Tutorial, after

Recommended Posts

Iterative (rekursive) Verarbeitung mit tkinter (in der Reihenfolge angezeigt)
Verarbeitungsreihenfolge beim Verketten im PySpark
Erstellen Sie eine Spinbox, die mit Tkinter in HEX angezeigt werden kann
Verarbeiten Sie Bilder in Python ganz einfach mit Pillow
Wie man tkinter mit Python in Pyenv benutzt
Parallele Verarbeitung ohne tiefe Bedeutung in Python
MVC mit Tkinter