Mainloop() a tkinter

Fermé
Hesje Messages postés 1 Date d'inscription lundi 5 décembre 2016 Statut Membre Dernière intervention 5 décembre 2016 - Modifié par crapoulou le 5/12/2016 à 19:33
 Utilisateur anonyme - 6 déc. 2016 à 19:15
Bonjour

J'ai une question sur l'utilisation de mainloop() dans Tkinter en Python. Je suis maintenant programmer un jeu et je voudrais utiliser Tkinter pour créer la mise en page.

Parfois, entre deux windows montrant, les données doivent être créées avant la window suivante doit être affichée. Je donne maintenant plusieurs fois mainloop() dans le même script pour garantir que chaque transaction est exécutée dans le bon ordre, et aucun acte est effectués avant que la fenêtre est affichée. J 'appele toujours à nouveau mainloop(), si la dernière fenêtre a déjà disparu.

Cependant, quelqu'un a obtenu le soupçon que cela est faux et je dois utiliser une seule fois mainloop() dans l'ensemble du script. Il n'a pas été clair pour moi pourquoi, et quelle solution je devrais utiliser différemment. Quelqu'un peut m'expliquer cela?

1 réponse

Utilisateur anonyme
6 déc. 2016 à 19:15
Why mainloop ?

Traduction en français :

" La réponse à ta question initiale est tu dois appeler mainloop une et une seule fois quand ton application est prête à démarrer.

mainloop n'est pas plus qu'une boucle infinie qui ressemble à ça :
while True:
    event=wait_for_event()
    event.process()
    if main_window_has_been_destroyed(): 
        break


Dans ce contexte, event signifie interaction utilisateur (clique souris, touche clavier, etc) et requête de la bibliothèque Tkinter [traduction à confirmer] ou du système d'exploitation (gestionnaire de fenêtre) pour dessiner ou redessiner un widget. Si cette boucle ne tourne pas, les évènement ne seront pas réactifs. Si les évènements ne réagissent pas, rien n'apparaîtra sur l'écran et ton programme va quitter (à moins que tu as une autre boucle infinie qui tourne)."

J'ai aussi trouvé ça et notamment :

Traduction en français :
" tk.mainloop() bloque l'exécution. Ca veut dire que l'exécution de ton code python s'arrête à cette ligne. Tu peux le voir en écrivant :
while 1:
    ball.draw()
    tk.mainloop()
    print "hello"   #NEW CODE
    time.sleep(0.01)

Tu ne verra jamais la sortie du print. La boucle est bloquée à tk.mainloop() qui réalise elle-même une boucle infinie [MODIFICATION A LA TRADUCTION].

D'un autre côté, les méthodes update_idletasks() et update() :
while True:
    ball.draw()
    tk.update_idletasks()
    tk.update()

...ne bloquent pas; l'exécution continue après que les méthodes soient finies, donc la boucle infinie se déroule encore et encore, ce qui fait la balle bouger.

Une boucle infinie contenant les méthodes update_idletasks() et update() peut agir comme un substitut de l'appel à tk.mainloop(). [A TRADUIRE : Note that the whole while loop can be said to block just like tk.mainloop() because nothing after the while loop will execute.]

Cependant, tk.mainloop() n'est pas un remplaçant pour ces lignes :
tk.update_idletasks()
tk.update()


... mais plutôt pour :
while True:
    tk.update_idletasks()
    tk.update()
"
1