IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

bind('<Configure>') et ButtonRelease-1 à retardement


Sujet :

Tkinter Python

  1. #1
    Membre habitué Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Points : 190
    Points
    190
    Par défaut bind('<Configure>') et ButtonRelease-1 à retardement
    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

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    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
    import Tkinter as Tk
     
    def TestGUI():
     
        class Context:
            pass
     
        self = Context()
        self.x = 500
        self.y = 500
        self.root = Tk.Tk()
        self.root.geometry('%dx%d'%(self.x, self.y))
        self.canvas = Tk.Canvas(self.root, width=self.x, height=self.y)
        self.canvas.pack()
        r = self.canvas.create_rectangle(0, 0, self.x, self.y, fill='grey')
        l1 = self.canvas.create_line(10, 10, 10, self.y-10, width=2)
        l2 = self.canvas.create_line(self.x-10, 10, self.x-10, self.y-10, width=2)
        l3 = self.canvas.create_line(10, 10, self.x-10, 10, width=2)
        l4 = self.canvas.create_line(10, self.y-10, self.x-10, self.y-10, width=2)
     
        def config(event):
            self.x, self.y = event.width+event.x, event.height+event.y
            self.canvas.config(width=self.x, height=self.y)
            self.canvas.coords(r, 0, 0, self.x, self.y)
            self.canvas.coords(l1, 10, 10, 10, self.y-10)
            self.canvas.coords(l2, self.x-10, 10, self.x-10, self.y-10)
            self.canvas.coords(l3, 10, 10, self.x-10, 10)
            self.canvas.coords(l4, 10, self.y-10, self.x-10, self.y-10)
     
        self.root.bind('<Configure>', config)
        self.root.mainloop()
     
    if __name__ == '__main__':
        TestGUI()
    Bonne journée

  3. #3
    Membre habitué Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Points : 190
    Points
    190
    Par défaut
    Okéééééééé !
    J'étais complément à coté de la plaque !
    Je pouvais toujours m'esquinter la santé avec les évènements... ce sont les éléments graphiques eux-même qu'il faut manipuler !
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/04/2009, 12h27
  2. Réponses: 2
    Dernier message: 22/05/2007, 03h45
  3. Configuration d'une zone - DNS, Bind
    Par Longrais dans le forum Réseau
    Réponses: 2
    Dernier message: 05/01/2006, 10h13
  4. Configuration bind
    Par gIch dans le forum Apache
    Réponses: 5
    Dernier message: 06/12/2005, 17h32
  5. Configuration de BIND sans IP fixe
    Par NeoMan dans le forum Réseau
    Réponses: 18
    Dernier message: 25/07/2005, 21h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo