Déclenchement d'actions dans une interface tkinter

Fermé
balisto1633 Messages postés 2 Date d'inscription mercredi 22 mars 2017 Statut Membre Dernière intervention 7 avril 2017 - 22 mars 2017 à 21:45
_Ritchi_ Messages postés 21283 Date d'inscription samedi 17 mars 2007 Statut Contributeur Dernière intervention 28 octobre 2024 - 8 avril 2017 à 19:17
Bonjour
Je suis un peu fou... mécontent d'un minuteur que nous utilisons au travail pour démarrer / arrêter des génératrices, je me suis mis dans l'idée de le gérer avec un rapsberry PI3 et un programme Python 3.4 en y programmant une interface graphique avec Tkinter.
Je suis un peu fou parce que avant, je n'avais jamais vu un rapsberry et jamais vu une ligne de code Python. Ma seule expérience se situe dans la VBA excel. Comme ça... c'est dit.

J'ai réglé la manière de faire communiquer mon rapsberry avec l'extérieur avec une carte à 4 relais.
Mon idée est d'avoir plusieurs lignes dans une interface qui représentent chacune une plage de fonctionnement de ma génératrice. par exemple ligne 1 démarrage à 0700 et fin à 1200, ligne 2 démarrage à 1330 et fin à 1730.

Je pensais géréer les heures avec des spinbox (1 pour l'heure et une pour les minutes) mais comme mes spinbox s'affichent systématiquement avec 00, si je veux entrer 12h30, cela fait beaucoup de click.

Quelqu'un a-t-il une meilleure idée ou une amélioration pour mon code?

H= Spinbox(fenetre, from_=0, to=23,width=2,state="readonly",wrap = True,format="%02.0f")
H.grid(row=0,column=1)
M = Spinbox(fenetre, from_=00, to=59,width=2,state="readonly",wrap = True,format="%02.0f")
M.grid(row=0,column=2)

La deuxième partie du problème sera: comment je gère ces valeurs pour qu'à l'heure dite, l'action X (ouverture ou fermeture du relais adéquat) se déclenche?

Merci d'avance pour vos réponses.

2 réponses

_Ritchi_ Messages postés 21283 Date d'inscription samedi 17 mars 2007 Statut Contributeur Dernière intervention 28 octobre 2024 6 075
6 avril 2017 à 20:06
Bonjour,
Pour la gestion des événements à des heures précises, voici un exemple de code avec le module schedule (plus de détails ici) et le lancement d'une fonction. Je te laisse le soin d'adapter à ton besoin spécifique.
import time, datetime, schedule

TIME = [
    ('06.04.2017', '19:49:00', 'relai_1_on()'),
    ('06.04.2017', '19:49:10', 'relai_1_off()'),
    ('06.04.2017', '19:49:20', 'relai_2_on()'),
    ('06.04.2017', '19:49:30', 'relai_2_off()')
]


def relai_1_on():
    print(" Activation du relai 1 ")
    # Appeler la fonction qui active le relai 1


def relai_1_off():
    print(" Coupure du relai 1 ")
    # Appeler la fonction qui désactive le relai 1

def relai_2_on():
    print(" Activation du relai 2 ")
    # Appeler la fonction qui active le relai 2


def relai_2_off():
    print(" Coupure du relai 2 ")
    # Appeler la fonction qui désactive le relai 2

def job():
    global TIME

    # on récupère la date et l'heure courante:
    date = datetime.datetime.now().strftime("%d.%m.%Y %H:%M:%S")

    # on compare cette date et l'heure courante à celles définies dans TIME:
    for i in TIME:
        runTime = i[0] + " " + i[1]
        # si une la date et heure sont trouvées:
        if i and date == str(runTime):
            # on lance la commande indiquée dans TIME
            eval(i[2])

# On lance toutes les secondes la fonction job():
schedule.every(1).second.do(job)

while True:
    schedule.run_pending()
    time.sleep(1)



Ritchi
0
balisto1633 Messages postés 2 Date d'inscription mercredi 22 mars 2017 Statut Membre Dernière intervention 7 avril 2017
7 avril 2017 à 21:40
Merci Richi

Un détail me chiffonne dans le principe de controler s'il est temps d'agir, attendre une seconde puis refaire le controle.

Prenons un exemple:
19h00, effectuer action A
19h02, effectuer action B
Si l'ordinateur met 5 minutes à traiter l'acction A, qu'advient-il de l'action B?

merci d'avance pour la réponse
0
_Ritchi_ Messages postés 21283 Date d'inscription samedi 17 mars 2007 Statut Contributeur Dernière intervention 28 octobre 2024 6 075
8 avril 2017 à 16:47
Bonjour

Bonne question, mais je dirais que c'est à toi de savoir combien de temps dure chaque action afin d'adapter le planning des tâches à effectuer.

Ritchi
0
_Ritchi_ Messages postés 21283 Date d'inscription samedi 17 mars 2007 Statut Contributeur Dernière intervention 28 octobre 2024 6 075
8 avril 2017 à 19:17
Bonjour,

Mais ceci étant dit, il existe des moyens pour lancer un procès sans attendre la fin du process précédent. C'est le threading.
Exemple 1
Exemple2

Ritchi
0