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 :
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()
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).

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