Une interface avec canvas, sans mainloop

Le problème exposé dans ce sujet a été résolu.

Bonjour, je cherche à faire une utilisation particulière de tkinter dans le cadre d'un de mes projets :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from tkinter import *
master = Tk()
w = Canvas(master,width=400,height=400)
w.pack()
x = 0
y = 0
while True :
    w.create_text(x+10,y+10, text=str(x)+str(y), font=('Helvetica', 10))
    x+=10
    y+=10

Ce code est un résumé simple de ce que je souhaite faire : une fenetre, un canva dans la fenetre, et y voir en temps réel dans la fenetre s'ajouter le texte petit à petit On notera que je n'utilise pas mainloop() puisqu'entre guillemets, ma mainloop est ma boucle infinie juste en dessous (je ne gère pas les évenements, je n'en ai pas besoin)

Le problème : la fenêtre ne s'affiche jamais. Elle s'affiche si j'utilise mainloop() après le pack, mais du coup ça bloque mon programme –"

Merci d'avance, en espérant avoir été clair :)

J'ai bataillé dessus deux jours, je post ce sujet, et dix minutes après je tombe sur la solution ^^ merci pour ta réponse, j'ai ainsi découvert qu'il est possible de ne pas utiliser mainloop, j'utilise la fonction Canvas.update() en effet, vu que j'ai déjà une boucle infinie pour l'éxecution de mon programme, je me contente d'y faire la mise à jour de mon canvas (je veut dire par là que je modifie mes objets, mes lignes mes cercles et l'ensemble de ce que je trace dans mon canva) puis je met à jour le canva lui même avec canva.update() ça marche relativement bien :)

Pourquoi retirer mainloop il n'y a pas d'intérêt, c'est une boucle événementielle… elle est obligatoire !

Ton code fonctionne très bien avec, car si tu le retires, ton interface se ferme automatiquement après l'exécution du code.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
from tkinter import *
import time as t

master = Tk()

w = Canvas(master,width=400,height=400)
w.pack()

x = 0
y = 0
while x < 100:
    w.create_text(x+10,y+10, text=str(x)+str(y), font=('Helvetica', 10))
    x+=10
    y+=10
    t.sleep(2)
    w.update_idletasks()

master.mainloop()
+0 -0

bon dans le doute j'utilise update_idletasks, mais pour le coup (et je m'en excuse si c'est pas vraiment la bonne façon de faire), mais tant pis pour la mainloop, mon application doit se terminer après la premiere boucle, il n'y a aucun intérêt pour moi de lancer la mainloop, sinon de la faire se terminer instantanément …

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte