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 :

programmation d'evenements et GUI


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 6
    Points
    6
    Par défaut programmation d'evenements et GUI
    Bonjour,

    Je souhaite programmer la manip suivante et je ne sais pas comment faire :

    J'ai un lecteur RFID (lecture par radiofréquence) connecté au PC via le port RS232. Livré avec l'appareil j'ai un dll et des fonctions pour le commander.

    ce que je veux faire, c'est mettre en place un canevas+boutons d'action dans une fenetre et quand le lecteur détecte un objet, en fonction de son numéro d'identification il m'affiche dans le canevas une petite image associée.

    Pour se faire,
    j'ai mis en place la fenetre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        def affiche_cadre(self):
            "Affiche le fond"
            self.fen=Tk()
            self.temp={}
            self.fen.title('Affectation des cartes')
            self.fond=Canvas(self.fen, width=730, height=600, bg='dark green')
            self.fond.pack(side=LEFT)
            self.cartes={} # dictinnaire joueurs : codes image ; nécéssaire pour afficher
            e1=Button(self.fen,text='Annuler',command=self.fen.destroy)
            e1.pack()
            e2=Button(self.fen,text='Start',command=self.lecture)
            e2.pack()
            self.fen.mainloop()
    et j'ai créer une boucle qui interroge l'appareil et lorsqu'il y a une réponse valable qui devrait afficher l'image par appel de la fonction affiche_cartes

    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
        def lecture(self):
            "boucle observation RFID"
            result=0
            fon=windll.RRMifare32
            fon.OpenComPort(0)
            p=POINTER(c_long)
            p=pointer(c_long(1))
            p1=POINTER(c_long)
            p1=pointer(c_long(1))
            card=POINTER(c_long)
            card=pointer(c_long(1))
            result=fon.OpenRf()
            verton=fon.ControlLed(0)
            while (result==0):
                interocarte=fon.RRMifare_Request(0 ,p)
                if p.contents.value==4:
                    carte=fon.RRMifare_AntiColl(card)
                    if card.contents.value==288315146:
                        result=1
                    elif card.contents.value>1000:
                        self.affiche_cartes(card.contents.value)
                    fon.RRMifare_Select(card.contents.value,p1)
                    fon.RRMifare_Halt()
                    p=pointer(c_int(1))
                    card=pointer(c_long(1))
                if result==1:break
            verton=fon.ControlLed(1)
            fon.CloseRf()
            fon.CloseComPort()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def affiche_cartes(self,id_c):
            "affiche les cartes vues"
            i=self.eq_id_carte[id_c]/4  
            j=self.eq_id_carte[id_c]%8
            carte=self.equiv(i*4+j)
            carte=carte+'.gif'
            a,b=65+j*85,70+i*120
            self.temp[i*8+j]=PhotoImage(file=carte)
            self.eq_objet_carte[self.fond.create_image(a,b,image=self.temp[i*8+j])]=8*i+j #renseigne le dico equivalence objet / carte
    Mais ça marche pas. Je pense que la boucle While "suspend" le mainloop. Les cartes s'affichent seulement après que la boucle ait été interrompu par une carte avec un identifiant particulier.
    J'imagine que je devrais travailler avec une gestion d'évenement pour que l'affichage se fasse en direct mais je ne sais pas comment faire.

    Merci de votre aide

    PS : Je suis neuf dans la programmation

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 6
    Points
    6
    Par défaut une piste
    J'ai trouvé une solution : j'ajoute self.fen.update() à la fin de la méthode affiche_cartes.

    Néanmoins si vous avez des commentaires ou d'autres propositions n'hésitez pas à m'en faire part.

    Merci

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 6
    Points
    6
    Par défaut ca marche pas
    Finalement Update () me permet d'afficher les cartes détectées.

    Mais mes boutons ne marchent pas. Je voudrais que cela soit le cas.

    Si vous avez des idées

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Tu pourrais peut-être remplacer ta boucle de surveillance continue par une surveillance discontinue avec un appel récursif de la fonction after() des widgets de Tkinter.

    Voici un petit exemple :
    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
    from Tkinter import *
     
    def tic_tac(i):
        if i%2 == 0:    fait_le_boulot(i, "Tic", "red")
        else:           fait_le_boulot(i, "Tac", "black")
        root.after(1000, tic_tac, i+1)
     
    def fait_le_boulot(index, chaine, couleur):
        label_01.configure(text = str(index) + " " + chaine, fg = couleur)
     
    root = Tk()
    label_01 = Label(root)
    label_01.pack()
    tic_tac(0)
    root.mainloop()
    La fonction tic_tac() se rappelle elle même toutes les 1000 ms.
    Elle en profite pour lancer la tâche à accomplir régulièrement en appelant fait_le_boulot().

    J'espère que çà pourra t'aider ...

    Je débute aussi et je sais même pas imprimer le contenu d'un frame (voir mon post)

Discussions similaires

  1. Executer un programme externe en mode GUI
    Par denfer06 dans le forum C#
    Réponses: 10
    Dernier message: 20/07/2007, 09h56
  2. Programmer un evenement d'un ActiveX dans une pageHTML
    Par bhj2000 dans le forum VBScript
    Réponses: 11
    Dernier message: 27/04/2007, 23h13
  3. Programme lancé à partir du GUI
    Par Flashget dans le forum Interfaces Graphiques
    Réponses: 6
    Dernier message: 14/03/2007, 10h06
  4. Programmation Windows Mobile avec GUI en C++
    Par Luke58 dans le forum Visual C++
    Réponses: 1
    Dernier message: 13/03/2007, 17h39
  5. Réponses: 1
    Dernier message: 26/09/2005, 19h29

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