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 :

Traitement événement clavier lent


Sujet :

Tkinter Python

  1. #1
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 870
    Points : 1 522
    Points
    1 522
    Billets dans le blog
    4
    Par défaut Traitement événement clavier lent
    Bonjour,
    Je trouve assez lent le traitement de mon événement clavier. Voilà plusieurs heures que je fais des recherches pour en améliorer la rapidité de traitement mais en vain..
    Je vous joins la partie du code concerné
    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
    def init_vaisseau_humain(self,image_path, indice, x_init, y_init):
        self.photo_vaisseau_humain = tk.PhotoImage(file=image_path)
        self.image_id[indice] = self.can.create_image(x_init,
                        y_init,anchor='center',image=self.photo_vaisseau_humain,
                                                            tags="vaisseau_humain")
        self.bind("<KeyPress-w>",self.gauche)
        self.bind("<KeyPress-b>",self.droite)
        self.update()
     
     
    def gauche(self,event):
        self.can.move("vaisseau_humain", -4, 0)
        self.update()
    def droite(self,event):
        self.can.move("vaisseau_humain", 4, 0)
        self.update()
    J'imagine qu'il doit y avoir une autre façon de faire plus efficace.
    Perso, je n'en ai pas trouvé et je trouve la doc pas vraiment explicite...
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Si vous ne postez pas un exemple de code qui permette de partager ce que vous trouvez "lent"... difficile de savoir si c'est une question de codage ou d'attente irréaliste.

    Une remarque cependant: vous n'êtes pas supposé appeler .update() sans de bonnes raisons (mais çà ne devrait pas aller immensément vite "sans" quoique on ne sait pas ce qu'il y a autour de l'extrait de code que vous avez posté).

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

  3. #3
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 870
    Points : 1 522
    Points
    1 522
    Billets dans le blog
    4
    Par défaut
    Désolé pour mes imprécisions ...
    Voici le code en étude d'un space Invanders/tkinter . Ce n'est évidemment qu'une ébauche. Ce code se contente d'afficher 20 ovnis de 60*60 pixels(10 par ligne) et de le déplacer de gauche à droite, puis de droite à gauche. Son déplacement est rapide .
    Par contre le vaisseau_humain contrôlé par l'appui des touches "w" et "b" est particulièrement lent et pourtant il se déplace de 4 pixels.
    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
    import tkinter as tk
    import time
     
    class EtudeSpaceInvanders(tk.Tk):
        def __init__(self):
            tk.Tk.__init__(self)
            self.can = tk.Canvas(self, width=1920, height=1080, background='black')
            self.can.pack()
            self.image_id= dict()
            self.photo_ovni = dict()
            self.dx = 50   
            self.dy = 0
        def init_ovni(self, image_path, indice_ovni, x_init, y_init,etiquette):
            self.photo_ovni[indice_ovni] = tk.PhotoImage(file=image_path)
            self.image_id[indice_ovni] = self.can.create_image(x_init,
                            y_init,anchor='center',image=self.photo_ovni[indice_ovni],
                                                                tags=etiquette)
     
     
        def init_vaisseau_humain(self,image_path, indice, x_init, y_init,etiq):
            self.photo_vaisseau_humain = tk.PhotoImage(file=image_path)
            self.image_id[indice] = self.can.create_image(x_init,
                            y_init,anchor='center',image=self.photo_vaisseau_humain,
                                                                tags=etiq)
            self.bind("<KeyPress-w>",self.gauche)
            self.bind("<KeyPress-b>",self.droite)
     
            self.update()
        def gauche(self,event):
            self.can.move("vaisseau_humain", -4, 0)
     
        def droite(self,event):
            self.can.move("vaisseau_humain", 4, 0)
     
        def set_directions(self, dx, dy):
            self.dx = dx
            self.dy = dy
     
        def deplacetag(self,etiquette):
            self.can.move(etiquette, self.dx, self.dy)
            self.update()
     
    ################################################################################
     
     
    if __name__ == "__main__":
     
        im = EtudeSpaceInvanders()
        vaisseau = im.init_vaisseau_humain("vaisseau.png",
                                 "a", 100, 900, "vaisseau_humain")
     
        indice = 1
        x = 60
        for i in range(10):
            """création de 10 ovni sur deux lignes.
            1er ligne --->indice, 2 lignes --->indice+100"""
            photo1 = im.init_ovni("Invaders1.png",
                                   indice, x, 60, "truc")
            photo2 = im.init_ovni("Invaders1.png",
                                   indice+100, x, 160, "truc")
     
            x += 120
            indice +=1
     
        im.set_directions(1,0)
        sens = 1
     
        for i in range(30):
            for i in range(700):
                im.deplacetag("truc")
                #time.sleep(1/400)
            sens = -1 * sens
            im.set_directions(sens,0)
    En espérant que mon brouillon est assez lisible.
    J'ai rectifié mon erreur avec updade(), merci
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Je vois.
    En fait, çà bouge en fonction de la réception des KeyPress expédiez par le driver du clavier.
    Il n'y a pas moyen de changer cette "fréquence" du côté tkinter.
    Par contre vous pouvez détecter KeyPress et KeyRelease et entre les deux faire comme si toutes les x ms via .after.

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

  5. #5
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 870
    Points : 1 522
    Points
    1 522
    Billets dans le blog
    4
    Par défaut
    Merci pour l'astuce en rajoutant KeyRelease, le mouvement ce fait deux fois plus vite (d'ailleurs je ne comprends pas pourquoi puisque je ne relâche pas la touche, j'imagine que cela a un rapport avec le fonctionnement intrinsèque de tkinter)
    Par contre reboucler sur la méthode de ma classe avec un after comme expliqué, n'engendre aucun accroissement de vitesse chez moi... (même si j'en crée une que pour initialiser les évent clavier)
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/08/2006, 18h54
  2. [API windows] Récupérer proprement les évènements clavier...
    Par heider dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 20/03/2006, 13h05
  3. [MFC][VC++.NET]gestion évènement clavier
    Par Rafoo dans le forum MFC
    Réponses: 2
    Dernier message: 14/12/2005, 09h29
  4. Réponses: 5
    Dernier message: 25/07/2005, 09h29
  5. Problème évènements clavier
    Par julie20 dans le forum Langage
    Réponses: 3
    Dernier message: 24/09/2003, 12h39

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