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 :

Comment feriez-vous ? [Python 3.X]


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 55
    Par défaut Comment feriez-vous ?
    Bonjour,

    J'ai fait un petit script pour "essayer" de dialoguer avec mes capteurs qui fonctionnent en modbus (je suis électronicien). Je crée autant de fenêtre qu'il y a de capteur sur mon bus de communication.

    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
    from tkinter import *
     
    class MaFenetre(Toplevel):
     
     
        def __init__(self, i):
            Toplevel.__init__(self)
     
     
            self.title(""+str(i))
            self.geometry("220x90")
            self.l1 = Label(self, text="ETAT")
            self.l2 = Label(self, text="ZERO")
            self.l3 = Label(self, text="SENS")
            self.l4 = Label(self, text="_DEF")
     
            self.e1 = Entry(self)
            self.e2 = Entry(self)
            self.e3 = Entry(self)
            self.e4 = Entry(self)
     
            self.l5 = Label(self, text="------")
            self.l6 = Label(self, text="------")
            self.l7 = Label(self, text="------")
            self.l8 = Label(self, text="------")
     
            self.l1.grid(row=0, column=0)
            self.l2.grid(row=1, column=0)
            self.l3.grid(row=2, column=0)
            self.l4.grid(row=3, column=0)
     
            self.e1.grid(row=0, column=1)
            self.e2.grid(row=1, column=1)
            self.e3.grid(row=2, column=1)
            self.e4.grid(row=3, column=1)
     
            self.l5.grid(row=0, column=2)
            self.l6.grid(row=1, column=2)
            self.l7.grid(row=2, column=2)
            self.l8.grid(row=3, column=2)
     
     
     
    def fenetres():
        for i in range(5):
            ma_fenetre = MaFenetre(i)
     
     
     
     
    fen = Tk(className="scan")
    fenetres()
     
     
    fen.mainloop()
    Ce qui me donne ceci :
    Nom : fen.PNG
Affichages : 265
Taille : 98,9 Ko

    C'est ici que je souhaiterai avoir vos conseils : J'aimerai que chaque fenêtre interroge en boucle son capteur. Quand je parle d'interrogation je veux dire envoyer sur le port COM la commande lecture d'un registre dans la mémoire du capteur.
    par exemple :
    ETAT = 0x9003
    ZERO = 0.003
    SENS = 0.810
    _DEF = 0x0000

    Voilà je ne sais pas trop comment commencer ?

    Merci d'avance

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Salut,

    Citation Envoyé par Patrick PETIT Voir le message
    Voilà je ne sais pas trop comment commencer ?
    Il faut déjà écrire une fonction qui récupère les informations d'un capteur (en paramètre) de sorte à arriver à écrire une boucle comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for c in capteurs:
         infos = lire_capteur(c)
         print(infos)
    puis associer chaque capteur à sa fenêtre de sorte à savoir mettre à jour l'affichage des fenêtres via:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for c in capteurs:
         infos = lire_capteur(c)
         mettre_a_jour(fenetres[c], infos
    Puis on ordonnance les lectures mise à jours via .after (éventuellement pour chaque capteur plutôt que pour leur ensemble).

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

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 55
    Par défaut
    Bonjour,

    Merci d'avoir répondu.

    J'ai ajouté des paramètres à mon objet
    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
    class MaFenetre(Toplevel):
     
     
        def __init__(self, i, mot_etat, mesure_zero, mesure_sens, mot_defaut):
     
            self.mot_etat = mot_etat
            self.mesure_zero = mesure_zero
            self.mesure_sens = mesure_sens
            self.mot_defaut = mot_defaut
     
            Toplevel.__init__(self)
     
            self.title(""+str(i))
            self.geometry("220x90")
            self.l1 = Label(self, text="ETAT")
            self.l2 = Label(self, text="ZERO")
            self.l3 = Label(self, text="SENS")
            self.l4 = Label(self, text="_DEF")
     
            self.e1 = Entry(self)
            self.e2 = Entry(self)
            self.e3 = Entry(self)
            self.e4 = Entry(self)
     
            self.l5 = Label(self, text="------")
            self.l6 = Label(self, text="------")
            self.l7 = Label(self, text="------")
            self.l8 = Label(self, text="------")
     
            self.l1.grid(row=0, column=0)
            self.l2.grid(row=1, column=0)
            self.l3.grid(row=2, column=0)
            self.l4.grid(row=3, column=0)
     
            self.e1.grid(row=0, column=1)
            self.e2.grid(row=1, column=1)
            self.e3.grid(row=2, column=1)
            self.e4.grid(row=3, column=1)
     
            self.l5.grid(row=0, column=2)
            self.l6.grid(row=1, column=2)
            self.l7.grid(row=2, column=2)
            self.l8.grid(row=3, column=2)
     
            self.e1.insert(0,str(hex(mot_etat)))
            self.e2.insert(0,str(mesure_zero))
            self.e3.insert(0,str(mesure_sens))
            self.e4.insert(0,str(hex(mot_defaut)))
    et je suis arrivé à cette boucle en suivant vos conseils (j'ai fixé volontairement à 4 fenêtres)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def fenetres():
        for num in range(4):
           instrument = minimalmodbus.Instrument('COM1', 32+num, mode='rtu')
           etat = instrument.read_register(16384, 0)
           defaut = instrument.read_register(16385, 0)
           ma_fenetre = MaFenetre(num,etat,0,0,defaut)
           time.sleep(0.2)
    Maintenant chaque donnée des mes capteurs se retrouvent dans leurs fenêtres respective.
    Par contre je ne vois pas comment faire la mise à jour de mes fenêtres !? Comment se servir de .after sans re-créer d'autres fenêtres ?

    Merci d'avance

    ps : je programme sur microcontroleur et j'avoue que quand on passe sur PC en POO c'est plus le même monde

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Salut,

    Citation Envoyé par Patrick PETIT Voir le message
    Par contre je ne vois pas comment faire la mise à jour de mes fenêtres !? Comment se servir de .after sans re-créer d'autres fenêtres ?
    Créer des widgets et les mettre à jour suite à une action de l'utilisateur ou ordonnancé par after... Dans tous les tutos. vous trouver les bases de la mécanique avec de exemples comme:

    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
    import tkinter as tk
     
    root = tk.Tk()
     
    labels = []
    for i in range(2):
        for j in range(2):
            label = tk.Label(root, text=' ', width=5)
            label.grid(row=j, column=i)
            labels.append(label)
     
    def animate(count, delay=500):
        for i, w in enumerate(labels):
            w['text'] = (i+1) * count
        if count > 0:
            root.after(delay, animate, count-1)
     
    animate(10)
    tk.mainloop()
    Si vous ne maîtrisez pas ce genre de mécanique, pas facile de la composer avec des objets plus compliqués.... mais c'est pour vous apprendre ces bases là qu'existent les tutos.

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

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 55
    Par défaut
    Bonsoir,

    Je m'étais mal exprimé dans le post précédant, en faite je ne trouvais pas comment agir sur mes objets (mes fenêtres) mais c'est après avoir réfléchi que je me suis dit : "forcement si je ne stock nul part mes fenêtres j'aurais du mal à faire des mises à jour dessus"

    Après avoir mis mes objets dans une liste j'ai pu faire des mise à jour avec des .after

    J'ai fait un essai de mise à jour sur une seul fenêtre avec un time juste pour comprendre la mécanique.


    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
    fen = Tk(className="scan") 
     
    liste = []
     
    for i in range(5): 
        ma_fenetre = MaFenetre(i)
        liste.append(ma_fenetre)
     
    def maj():
        heure = time.time()
        liste[0].e3.insert(1,"tt")
        liste[0].after(1000,maj)
     
    heure
    maj()
     
     
    fen.mainloop()
    Je posterais le script complet lundi et je mettrais le post en RESOLU.
    Je vous remercie d'avoir pris le temps de m'aider, le plus drôle c'est quand je relis le script je me dis : c'était tellement simple en faite ... (quand quelqu'un te guide )

    Juste une dernière chose (j'accepte d'être envoyé sur les roses car j'ai pas cherché) : Connaissez-vous une astuces pour organiser mes fenêtres (toplevel) lors de leurs création ? Sur Linux elles sont en cascade et sous windows elles sont l'une au dessus de l'autre.

    Merci et bonne soirée

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Salut,

    Citation Envoyé par Patrick PETIT Voir le message
    Connaissez-vous une astuces pour organiser mes fenêtres (toplevel) lors de leurs création ?
    Pour placer une fenêtre sur l'écran à se fait avec .geometry...
    Mais il serait peut être plus astucieux de remplacer vos fenêtres (Toplevel) par des Frame et de les positionner via .grid (dans une seule fenêtre).

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

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

Discussions similaires

  1. Comment feriez-vous un éditeur texte avec metadonnées
    Par slanbuas dans le forum Général Java
    Réponses: 1
    Dernier message: 07/07/2008, 00h25
  2. Comment feriez-vous? conception d' une base de données.
    Par Patrick25300 dans le forum Schéma
    Réponses: 4
    Dernier message: 05/05/2008, 18h41
  3. [SQL] Comment feriez-vous cette requête pour une recherche ?
    Par Core8 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/02/2008, 11h58
  4. [D7] Comment feriez-vous une messagerie instantanée façon MSN ?
    Par ero-sennin dans le forum Web & réseau
    Réponses: 37
    Dernier message: 09/08/2007, 20h53
  5. [Debug] Comment feriez-vous ?
    Par mandaillou dans le forum C++
    Réponses: 4
    Dernier message: 21/03/2007, 17h07

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