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 :

Problème pour bouger une boule en continu [Python 3.X]


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 47
    Par défaut Problème pour bouger une boule en continu
    Bonjour,

    Ma boule se déplace de plus en plus vite à chaque changement de direction.
    La position (en x ou y) varie pourtant toujours de 10 en 10
    J'ai aussi essayé avec .move. Cela ne résoud pas le problème.
    J'ai regardé quelques scripts sur google mais n'ai rien vu d'intéressant et cela fait un bout de temps que je cherche.
    Le message ne garde pas l'indentation, dsl

    Des idées ?
    A coté, des suggestions pour améliorer le code ?

    Merci




    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    from tkinter import * 
     
    class Application(Tk):
        def __init__(self):
            # Graphique 
            Tk.__init__(self)
            self.cadre = Canvas( self,bg='light yellow',height=500,width=500)  
            self.cadre.focus_set()
            self.cadre.bind("<Up>", self.go_up)
            self.cadre.bind("<Down>", self.go_down) 
            self.cadre.bind("<Left>", self.go_left)
            self.cadre.bind("<Right>", self.go_right)           
     
            # Init
            self.dy = 10
            self.dx = 10
            self.x = 250
            self.y = 250 
            self.r = 20
            self.oval1 = self.cadre.create_oval(self.x, self.y, self.x+self.r, self.y+self.r, fill='red')
            self.cadre.grid(row = 1) 
     
        def move(self):  
            if self.up == 1:
                self.y -= self.dy
            elif self.down == 1:
                self.y += self.dy 
            elif self.left == 1:
                self.x -= self.dx         
            elif self.right == 1:
                self.x += self.dx
            print(self.x)    
            self.cadre.coords(self.oval1, self.x, self.y, self.x+self.r, self.y+self.r) 
            self.after(100, self.move)    
     
        def go_up(self, event):
            print("up")  
            self.up = 1
            self.down = 0
            self.left = 0
            self.right = 0
            self.move()
     
        def go_down(self, event):
            print("down")
            self.up = 0
            self.down = 1
            self.left = 0
            self.right = 0
            self.move()        
     
        def go_left(self, event):
            print("left")
            self.up = 0
            self.down = 0
            self.left = 1
            self.right = 0
            self.move()
     
        def go_right(self, event):
            print("right")
            self.up = 0
            self.down = 0
            self.left = 0
            self.right = 1
            self.move()
     
    #------ Programme principal --------------------------------------------------- 
     
    launch = Application()
    launch.mainloop()

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 718
    Par défaut
    Salut,

    Chaque fois que la méthode move est appelée, le .after resoumet un appel 100ms plus tard... Et elle est appelée pour tout changement de direction. Donc, réfléchissez un peu: après le premier changement on a un "move" qui se rappelle, après le second 2 move, après le 3ème... Et 3 move tous les 100ms, çà fait un déplacement 3 fois plus rapide.

    Un solution peut être d'appeler move une seule fois au démarrage (et le laisser se rappeler tout seul) et d'éviter de le faire lors des changements de direction: ils modifient juste des variables.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 47
    Par défaut
    Merci, cela fonctionne

    j'ai eu du mal à me représenter la chose mais c'est bon maintenant.

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
     
    from tkinter import * 
     
    class Application(Tk):
        def __init__(self):
            # Graphique 
            Tk.__init__(self)
            self.cadre = Canvas( self,bg='light yellow',height=500,width=500)  
            self.cadre.focus_set()
            self.cadre.bind("<Up>", self.go_up)
            self.cadre.bind("<Down>", self.go_down) 
            self.cadre.bind("<Left>", self.go_left)
            self.cadre.bind("<Right>", self.go_right)           
     
            # Init
            self.dy = 10
            self.dx = 10
            self.x = 250
            self.y = 250 
            self.r = 20
            self.up = 0
            self.down = 0
            self.left = 0
            self.right = 0
     
            self.oval1 = self.cadre.create_oval(self.x, self.y, self.x+self.r, self.y+self.r, fill='red')
            self.cadre.grid(row = 1) 
     
        def move(self):  
            if self.up == 1:
                self.y -= self.dy
            elif self.down == 1:
                self.y += self.dy 
            elif self.left == 1:
                self.x -= self.dx         
            elif self.right == 1:
                self.x += self.dx
            self.cadre.coords(self.oval1, self.x, self.y, self.x+self.r, self.y+self.r) 
            self.after(100, self.move)    
     
        def go_up(self, event):
            print("up")  
            self.up = 1
            self.down = 0
            self.left = 0
            self.right = 0
     
        def go_down(self, event):
            print("down")
            self.up = 0
            self.down = 1
            self.left = 0
            self.right = 0     
     
        def go_left(self, event):
            print("left")
            self.up = 0
            self.down = 0
            self.left = 1
            self.right = 0
     
        def go_right(self, event):
            print("right")
            self.up = 0
            self.down = 0
            self.left = 0
            self.right = 1
     
    #------ Programme principal --------------------------------------------------- 
     
    launch = Application()
    launch.move()
    launch.mainloop()

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 718
    Par défaut
    Sinon plus concis, çà donnerait plutôt çà:
    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
    from tkinter import * 
     
    motions = {
        'Up':   (0, -1),
        'Down': (0, 1),
        'Left': (-1, 0),
        'Right':(1, 0),
        }
     
    class Application(Canvas):
        def __init__(self):
            super().__init__(bg='light yellow',height=500,width=500) 
            self.focus_set()
            for key in motions:
                self.bind('<%s>' % key, self.on_arrow)
            self.dz = 10
            self.direction = None
            self.oval1 = self.create_oval(250, 250, 270, 270, fill='red')
     
        def move(self):
            if self.direction:
                cx, cy = motions[self.direction]
                super().move(self.oval1, cx * self.dz, cy * self.dz)
            self.after(100, self.move)    
     
        def on_arrow(self, e):
            self.direction = e.keysym
     
     
    #------ Programme principal --------------------------------------------------- 
     
    launch = Application()
    launch.pack()
    launch.move()
    launch.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 47
    Par défaut
    Ok merci, c'est nettement plus court !

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 23/12/2004, 18h01
  2. Problème pour positionner une liste déroulante
    Par ouckileou dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 30/09/2004, 01h05
  3. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30
  4. [MSSQL] Problème pour sélectionner une seule occurence
    Par Tinfolley dans le forum Langage SQL
    Réponses: 4
    Dernier message: 02/07/2004, 09h02
  5. Réponses: 3
    Dernier message: 29/08/2003, 10h57

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