[PYTHON] Traitement itératif (récursif) avec tkinter (affiché dans l'ordre)

Goal Lors de la première utilisation du tkinter de python, j'ai créé un programme qui affiche les mots anglais dans l'ordre, alors je l'ai enregistré.

Qu'est-ce que tkinter?

Une bibliothèque pour générer des parties d'interface graphique, etc. avec python, peut être installée avec homebrew.

brew install tcl-tk

Si vous utilisez pyenv, vous devrez peut-être désinstaller-> réinstaller la version de python que vous souhaitez utiliser après avoir fait ce qui précède.

Traitement itératif (récursif)

Si vous effectuez une recherche sur Internet, vous trouverez souvent des exemples de mise en œuvre de compteurs à rebours.

Il est réalisé en changeant le nombre à l'intérieur de l'étiquette spécifiée (caractère ou partie de zone à afficher) toutes les secondes, et il devrait utiliser à peu près les algorithmes et fonctions suivants.

class Timer
  def __init__(self):
    -Initialisation des variables à compter
    -Générer une étiquette pour afficher le numéro de la minuterie
    

  def count_up(label):
    -Afficher la valeur de la variable à compter sur l'étiquette
    -Incrément de comptage
    -1 seconde plus tard_up()Appeler une fonction(Récursif) ---(*)

window = tkinter.Tk() #génération de fenêtre
count_up_timer = Timer(window)
window.mainloop()

À (*), utilisez la méthode after () de tkinter. Appelez la fonction spécifiée après l'heure spécifiée avec le nom tel qu'il est.

Dans ce qui suit, le mot est affiché à la place du numéro, ou l'affichage est arrêté à un endroit spécifique.

Un programme qui affiche les mots anglais saisis dans l'ordre

Qu'as-tu fait

La raison pour laquelle j'ai choisi cela comme thème d'implémentation est que j'ai utilisé une application de lecture appelée "Spritz". Cette application lit des phrases en anglais sur la page Web et les affiche mot par mot comme un calcul flash.

Cliquez ici pour Spritz D'après le résultat de la recherche, une part considérable du temps nécessaire à la lecture d'une phrase est consacrée au mouvement du point de vue, il semble que les mots sont affichés dans l'ordre en un seul endroit.

En bref, j'ai implémenté ce faux en utilisant tkiner (la famille principale a beaucoup d'idées scientifiques telles que rendre une lettre de chaque mot rouge pour faciliter la correspondance avec le point de vue). Eh bien, il peut être judicieux d'implémenter la fonction de redémarrage.

la mise en oeuvre

J'ai abandonné la fonction de lecture du texte sur la page Web. Je vais copier le texte dans la zone de texte. L'interface utilisateur ressemble à ceci.

tkinter_test.png

Lorsque vous appuyez sur le bouton Démarrer,
Les mots de la phrase dans la zone de texte ci-dessus sont affichés un par un sous le bouton (dans l'image, «Totoro» est affiché).

Code ci-dessous

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

La méthode after elle-même ne garantit pas une précision de temps élevée, donc si vous la souhaitez, vous devez la modifier séparément.

Outre l'utilité du programme lui-même, j'ai découvert tkinter.

référence

RIP Tutorial, after

Recommended Posts

Traitement itératif (récursif) avec tkinter (affiché dans l'ordre)
Ordre de traitement lors du chaînage dans PySpark
Créez une Spinbox pouvant être affichée dans HEX avec Tkinter
Traitez facilement des images en Python avec Pillow
Comment utiliser tkinter avec python dans pyenv
Traitement parallèle sans signification profonde en Python
MVC avec Tkinter