Bonjour,
je suis ceinture jaune en TkInter et je tombe sur un os qui me paraît au moins du niveau ceinture marron :
J'affiche un canvas avec un cadre dessiné dedans, et je voulais le voir se redimensionner en même temps que la fenêtre (quand je resize en attrapant un des bords).
Mais je me suis aperçu que le canvas.configure( width,height ) était tellement lent que le redimensionnement en temps réel était à oublier...
Du coup, j'ai voulu me rabattre sur le bon vieux fantôme (comme au mauvais vieux temps de Windows 3).
Mon idée était de mémoriser les dimensions pendant le resize à la souris puis de réactualiser ma fenêtre au moment du release du bouton.
Mais là, 2 os :
1° os (surement explicable) : le relâchement du bouton de la souris à la fin d'un resize ne semble pas déclencher d’évènement.
2° os (inexplicable à mes yeux novices) : quand on relâche le bouton à la fin du resize, il semble rester des évènements de resize dans la queue. On ne les reçoit qu'en cliquant dans la fenêtre...
Voici un code minimaliste qui permet de reproduire mon mystère mystérieux :Essayez de redimensionner la fenêtre : quand on relâche rien ne se passe (os n°1) et il faut cliquer dans la fenêtre pour voir le cadre se redimensionner tout doucement (os n°2).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 import Tkinter def TestGUI () : class Context : pass self = Context() self.x = 500 self.y = 500 self.configuring = False self.root = Tkinter.Tk() self.root.geometry('%dx%d'%( self.x,self.y )) self.canvas = Tkinter.Canvas( self.root, width=self.x, height=self.y ) def _config (event): print 'config canvas %d,%d + %d,%d'%(event.width,event.height,event.x,event.y) self.x,self.y = event.width+event.x,event.height+event.y self.configuring = True def _end_config (event): if self.configuring: print 'end config' self.configuring = False _draw() def _draw (): self.canvas.configure( width=self.x , height=self.y ) self.canvas.create_rectangle( 0,0,self.x,self.y,fill='grey' ) self.canvas.create_line( 10, 10, 10,self.y-10,width=2 ) self.canvas.create_line( self.x-10, 10,self.x-10,self.y-10,width=2 ) self.canvas.create_line( 10, 10,self.x-10, 10,width=2 ) self.canvas.create_line( 10,self.y-10,self.x-10,self.y-10,width=2 ) self.canvas.pack() self.canvas.bind('<Configure>',_config ) self.root.bind('<ButtonRelease-1>',_end_config ) _draw() self.root.mainloop() if __name__ == '__main__': TestGUI()
Si quelqu'un y voit clair... je suis preneur.
Et si en plus, ce quelqu'un sait comment redimensionner en temps réel, ce serait encore mieux...
Merci d'avance
Partager