Créer une boucle principale avec tkinter?

2020-07-27 python python-3.x tkinter

J'ai ce code:

from tkinter import *

root = Tk()
while True:
    print('hello')
    root.update()

root.mainloop()

Et ici la boucle principale est:

while True:
    print('hello')
    root.update()

Mais je ne suis pas sûr que ce soit la meilleure façon de faire cela (cela ne fonctionne pas si je veux entrer quelque chose)

Ensuite, j'ai essayé celui-ci:

from tkinter import *
from threading imoport Thread
import time

root = Tk()

text = Label()
text.pack()

def main():
    while True:
        text[text] = str(time.time())

thread = Thread(target=main)
thread.start()

root.mainloop()

Mais comme je l'ai réalisé, cela ne fonctionne pas aussi vite que prévu. La question est donc: quelle est la meilleure façon de créer une boucle principale?

Answers

C'est la meilleure façon de boucler une fonction avec tkinter est la .after(*ms, *callback) .

import tkinter as tk #import tkinter
import datetime #import datetime for our clock

def tick(): #function to update the clock
    showed_time = '' #current showed time
    current_time = datetime.datetime.now().strftime("%H:%M:%S") #real time
    if showed_time != current_time: #if the showed time is not the real time
        showed_time = current_time #update the variable to compare it next time again
        clock.configure(text=current_time) #update the label with the current time
    clock.after(1000, tick) #call yourself in 1000ms (1sec.) again to update the clock
    return None

root=tk.Tk()

clock = tk.Label(root)
clock.pack()
tick()

root.mainloop()

Dans le script ci-dessus, nous avons construit une horloge numérique et nous sommes mis en contact avec la méthode after. La méthode after n'est rien d'autre qu'un intervalle et à la fin de cet intervalle, nous voulons que quelque chose se produise.

Pour en savoir plus sur cette méthode de widget de base [cliquez]

après (delay_ms, callback = None, args)

Cette méthode enregistre une fonction de rappel qui sera appelée après un nombre donné de millisecondes . Tkinter garantit seulement que le le rappel ne sera pas appelé avant cela ; si le système est occupé, le délai réel peut être beaucoup plus long.

import tkinter as tk 
import datetime 

def tick():
    showed_time = '' 
    current_time = datetime.datetime.now().strftime("%H:%M:%S")
    if showed_time != current_time:
        showed_time = current_time
        clock.configure(text=current_time)
    global alarm #make sure the alarm is known
    alarm = clock.after(1000, tick)#assign the alarm to a variable
    return None
def stop():
    stop.after_cancel(alarm) #cancel alarm
    

root=tk.Tk()

clock = tk.Label(root)
clock.pack()
stop = tk.Button(root, text='Stop it!', command=stop)
stop.pack()
tick()


root.mainloop()

Ici , nous avons le même code mais avec la possibilité d'annuler notre boucle avec la after_cancel méthode de tkinter. Vous n'avez pas besoin de globaliser l'alarme dans une classe . self.alarm = self.clock.after(...) fonctionne très bien.

after_cancel (id)

Annule un rappel d'alarme.

id

Identificateur d'alarme.

Pourquoi le filetage n'est pas un bon choix pour coder le travail de cadre

Related