Problème avec la fonction polling

Fermé
JulienElmon Messages postés 1 Date d'inscription mercredi 10 juillet 2019 Statut Membre Dernière intervention 10 juillet 2019 - Modifié le 17 juil. 2019 à 11:26
mamiemando Messages postés 33459 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 janvier 2025 - 17 juil. 2019 à 11:25
Bonjour / Bonsoir.

Je suis nouveau dans le langage python et je travaille actuellement sur du contrôle d'accès avec un lecteur de badge "element14 NXP". Mon but est de créer un programme qui récupère le numéro de la carte, ainsi que la date et l'heure quand on badge, pour qu'ensuite une interface graphique s'ouvre avec les informations du badge et de l'utilisateur.

Le problème est que je dois faire en sorte que mon programme fonctionne sans interruption. Lorsqu'un utilisateur badge, fait son rapport et l'envoie, le programme doit se réinitialiser.

J'ai donc essayé avec la fonction polling mais cela ne marche pas. Soit la variable n'est pas définie, soit il me met l'erreur
nxppy.SelectError
qui se déclenche quand le lecteur ne détecte aucun carte.

Si une âme charitable peut m'aider dans ma quête

Mon code :

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from Tkinter import *
from datetime import datetime
import nxppy
import time
import polling

mifare = nxppy.Mifare()

while True:
    try:
        if mifare is None:
            mifare.poll(lambda: mifare.select(), step=0.5, poll_forever=True)
        if mifare is not None:
            uid = mifare.select()
            uiddecimal = int(uid, 16)
            datetime = time.strftime('%d/%m/%y %H:%M',time.localtime())
            print uiddecimal
    except nxppy.SelectError:
        pass

class Application:
    def __init__(self, master):
        frame = Frame(master)
        frame.pack()
        Label(frame, text="Numero de badge : ").grid(row=0, column=0)
        Label(frame, text=uiddecimal).grid(row=0, column=1)
        Label(frame, text="Date et heure d'arriver : ").grid(row=1, column=0)
        Label(frame, text=datetime).grid(row=1, column=1)
        Label(frame, text="Nom de l'agent : ").grid(row=2, column=0)
        Label(frame, text="").grid(row=2, column=1)
        Label(frame, text="Prise de service : ").grid(row=3, column=0)
        saisir = StringVar()
        saisir.set("")
        saisie = Entry(frame, text=saisir, width=50).grid(row=4, column=0)
        prise_service = saisir.get()
        Button(frame, text='Envoyer', command="").grid(row=5, column=1, padx=5, pady=50)
        Button(frame, text='Quitter', command=quit).grid(row=5, column=0, padx=5, pady=50)

root = Tk()
root.wm_title('Lecteur badge')
root.geometry("500x300")
app = Application(root)
root.mainloop()


Merci d'avance de votre aide .Pardon pour les fautes d'orthographe.
A voir également:

1 réponse

mamiemando Messages postés 33459 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 janvier 2025 7 813
Modifié le 17 juil. 2019 à 11:29
Bonjour,

Pense à copier ton colle avec les balises de code (cf triangle à droite du 4e bouton, au dessus de la boîte dans laquelle tu tapes ton message) et à copier du code indenté !! (j'espère avoir corrigé tout comme il faut).

Je ne connais pas les packages que tu utilises et s'il y a un badge ça va être difficile de reproduire ton code, mais il y a au moins une chose qui me paraît étrange. Tu utilises une boucle d'événement (
root.mainloop()
) ce qui est normal pour une application graphique. Ça permet au programme d'attendre une interaction de la part de l'utilisateur (clic ou autre). Par exemple un clic sur le bouton quitter va appeler la callback quit (qui, soit dit en passant, n'est pas définie à ce stade).

Par contre tu écris aussi une boucle
while
qui va complètement à l'encontre de ça. En réalité, les événements du type l'utilisateur a badgé devrait faire partie de ta boucle d'événement.

Quelques recommandations :
  • Procède par étape. Commence par faire une application minimale, qui réagit aux clics (pour quitter, pour "envoyer", quitte à afficher "envoyer" en attendant de faire la vraie tâche de ton application). Et une fois que c'est fait, regarde des exemples sur internet d'utilisation de nppxy.
  • Tant qu'à faire utilise plutôt python3 pour rentrer dans le monde moderne. En terme de code, cela consiste principalement à utiliser print comme une fonction (e.g.
    print("coucou")
    ) et à installer les modules python dont tu as besoin pour python3.
  • Et sinon pycharm est effectivement un outil parmi tant d'autre pour développer en python. Ce n'est pas un mauvais choix, mais sache qu'un simple éditeur texte suffit pour écrire un fichier python, et un terminal suffit pour appeler l'interpréteur python avec ton programme passé en paramètre (e.g.
    python3 programme.py
    )


Bonne chance
0