[Python] Interface TKinter et Boucle infinie
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

[Python] Interface TKinter et Boucle infinie



  1. #1
    Loupsio

    [Python] Interface TKinter et Boucle infinie


    ------

    Bonjour,
    Est ce que il est possible pour python de faire quelque chose (une boucle) tout en attendant une entrée dans un champs TKinter?

    car j ai un programme qui va chercher toutes les 5 secondes une information html en boucle infini, mais j'aimerai y rajouter une interface TKinter et que l'utilisateur puisse modifier un des parametres (en rentrant au claver dans la case et en appuyant sur <Entree>)

    une partie de mon code ressemble a ça :

    Code:
    fen1 = Tk()
    txtDate=Label(fen1, text='Date (yyyy-mm-dd)')
    dategraph=Entry(fen1)
    txtDate.grid(row=0,sticky=E)
    dategraph.grid(row=0, column=1)
    dategraph.bind("<Return>",choixGraph)
    
    
    while i==0:
        valeur=recuperer_temperature()
        heure=strftime("%H:%M:%S")
        jour=str(date.today())
        ecrire_AllData() #rempli un csv
        ecrire_jour()   #rempli un csv 
        print(dateheure,":",valeur,"\n")    # affiche les resultats en temps reel  dans fenetre python
        lancer_R()    #lance subprocess pour envoyer code R
    
        sleep(4) # attend 4 secondes avant de relancer la requete html
    
    fen1.mainloop()
    Dans ce cas il me recupere bien l'info toutes les 4 secondes, mais ma fenetre TKinter n'apparait jamais
    Et si j'enlève le while, la fenetre apparait mais il ne me fait plus la boucle de récupération toutes les 4 secondes et ne me récupère qu'une fois la valeur
    Et si je met le while derrière le "mainloop" de TKinter, la boucle ne se lance qu'après avoir fermé la fenetre TKinter

    Or j'aimerai que la boucle fonctionne en continue (avec la fenetre TKinter à l'écran) et que de façon ponctuelle, un utilisateur puisse rentrer une donnée

    -----
    Dernière modification par Loupsio ; 03/11/2017 à 14h06.

  2. #2
    Loupsio

    Re : [Python] Interface TKinter et Boucle infinie

    Bonsoir,
    je me permet de up puisque je n'ai toujours pas trouvé comment faire,
    N'y a t il aucun moyen pour que python soit dans une boucle, et que l'utilisateur puisse changer certains paramètres de temps a autres sans avoir a couper le programme et le relancer? car a partir du moment ou la boucle est lancée, actuellement il m'est impossible d'écrire ou modifier des valeurs dans l'interface TKinter afin de changer les paramètres

    Merci
    Dernière modification par JPL ; 20/11/2017 à 18h31. Motif: titre corrigé

  3. #3
    CM63

    Re : [Python] Interface TKinter et Boucle infinie

    Bonjour,

    Il faut faire des call-back, Tkinter ne permet pas de faire cela ? (je ne me souviens plus) il n'y a pas des méthodes onClick() ou quelque chose comme cela?

  4. #4
    Loupsio

    Re : [Python] Interface TKinter et Boucle infinie

    Oui il y a des moyens de lancer quelque chose lors d'un click ou d'une pression clavier (style Touche Entrée) , c'est d'ailleurs ce que j'utilise
    mais mon probleme vient du fait qu'il est déja lancé dans une fonction qui tourne en boucle infinie (volontairement)
    or les actions click ou press bouton se font lorsque python attend une action,

    par exemple :
    Code:
    fen1 = Tk() # initie la fait que je lance une fenetre d'interface avec TKinter
    entreeutilisateur=Entry(fen1) #on definit que c'est un champs ou l'utilisateur écrira l'information
    entreeutilisateur.bind("<Return>",lancerProg) #Appuyer sur la touche entrée lance la fonction "lancerProg"
    fen1.mainloop() #fin de la boucle Tkinter et donc repart en quelque sorte sur la ligne fen1 jusqu'a ce qu'il se passe quelque chose coté utilisateur
    dans ce cas ca marche sans probleme, j'écris un truc, j'appuye sur <Entree> il lance la fonction, elle s'effectue en une fraction de seconde en prenant en compte le paramètre que je lui ai donné dans la fenetre, et si je relance en réappuyant sur <Entree> il me le refait une seconde fois

    mais dans la fonction qui est lancée lorsqu'on press <Entree>, il y a une boucle infinie, et tant que la boucle est active je ne peux pas agir sur l'interface TKinter puisque le programme est déja "occupé" a faire quelque chose
    Ducoup je ne peux pas changer l'un des parametres voulu, pour que lors de la prochaine itération de la boucle il ajuste en fonction de ce que je lui demande car comme il s'occupe de faire ce qui est dans la boucle il ne peut pas prendre en compte ce que je lui demande
    il faut donc que je stoppe le programme et le relance si je veux modifier un paramètre

  5. A voir en vidéo sur Futura
  6. #5
    CM63

    Re : [Python] Interface TKinter et Boucle infinie

    Citation Envoyé par Loupsio Voir le message

    mais dans la fonction qui est lancée lorsqu'on press <Entree>, il y a une boucle infinie
    Ça, ça ne peut pas marcher, tu ne dois pas mettre une boucle infinie (à toi) dans un call-back. Il faut faire autrement. J'avoue que je ne vois pas comment faire car je ne suis pas sur de comprendre ce que tu veux faire (je veux dire : qu'est-ce que tu cherche à faire en mettant ta boucle infinie) mais ce qui est sur c'est qu'il ne faut pas mettre une nouvelle boucle infinie dans une routine appelée par un événement.
    En fait il faut penser que la machine passe son temps à ne rien faire dans la mainloop, elle ne va faire quelque chose que lorsqu’il y aura un événement, il ne faut pas qu'alors , elle soit bloquée dans une boucle infinie, car elle ne pourra plus revenir à la mainloop , attendre de nouveaux événements.

    Si je trouve la solution dans la journée, je te la poste.

  7. #6
    Loupsio

    Re : [Python] Interface TKinter et Boucle infinie

    Citation Envoyé par CM63
    je ne suis pas sur de comprendre ce que tu veux faire (je veux dire : qu'est-ce que tu cherche à faire en mettant ta boucle infinie) mais ce qui est sur c'est qu'il ne faut pas mettre une nouvelle boucle infinie dans une routine appelée par un événement.
    Le programme récupère des données sur un site, sachant que ce site affiche en temps réel des mesures, mais ne les stock pas
    le programme va donc récupérer la valeur toutes les 5 secondes et les stocker puis afficher les données graphiquement et mettre a jour le graphe en temps réel (en lancant un programme R en subprocess)

    concrètement mon code ressemblerai a ca (en simplifié)

    Code:
    def lancerProg():
    i=0
    x=entreeutilisateur.get()
          while i=0 :
            print(x*2)
            sleep(4)
    
    
    fen1 = Tk()
    entreeutilisateur=Entry(fen1)
    entreeutilisateur.bind("<Return>",lancerProg)
    fen1.mainloop()
    bon ici dans l'exemple j'ai mis un calcul bidon pour simplifier, mais concrètement c'est la structure suivante, avec un sleep(4) car le site sur lequel il va récupérer l'information est lui meme mis a jour toutes les 4 secondes

    ducoup je veux qu'il continue de récupérer ces données en continue toutes les 4 secondes, mais de temps en temps changer un des paramètres (un parametre que python renvoi a R pour l'affichage graphe lorsqu'il lance le subprocess, c'est a dire a chaque itération de la boucle) afin de pouvoir agir sur le graphique sans modifier le code R, directement par l'interface qui elle meme lance le script R une fois par iteration
    Dernière modification par Loupsio ; 21/11/2017 à 10h09.

  8. #7
    CM63

    Re : [Python] Interface TKinter et Boucle infinie

    Ok, je vois, je n'ai pas le temps de rentrer dans le détail, mais je pense que dans ce cas, il faut déclencher ta récupération de mesures par un timer, qui sera programmé à faire une aquisition toutes les 4 secondes. Regarde dans Python si il y a une library de timer.

    En gros, lors du lancement de ton appli, tu vas créer le timer, quelque chose comme :
    montimer=new Timer

    Puis tu vas le programmer pour lancer ton acquisition de données toutes les 4 secondes. Puis tu vas sur ta boucle mainloop.

    Dès que 4 secondes seront écoulées, le timer va interrompre la mainloop et appeler ta routine d’acquisition de données, puis il va revenir à la mainloop et donner la main éventuellement aux événements clavier ou écran.

    Il faut s'assurer que l’acquisition de données ne dure pas plus de 4 secondes, en fait il faut qu'elle dure beaucoup moins.
    Dernière modification par CM63 ; 21/11/2017 à 10h49.

  9. #8
    CM63

    Re : [Python] Interface TKinter et Boucle infinie

    Jai l'impression qu'il faut utiliser la library Thread :

    Code:
    def hello():
        print "hello, world"
    
    t = Timer(30.0, hello)
    t.start() # after 30 seconds, "hello, world" will be printed

  10. #9
    Loupsio

    Re : [Python] Interface TKinter et Boucle infinie

    Effectictivement, remplacer la fonction sleep par la fonction timer corrige le problème, (et l'acquisition des données dure parfois moins d'une secondes, parfois une seconde, donc suffisamment inférieur au
    Merci beaucoup

Discussions similaires

  1. Problème - Fenêtre Tkinter python
    Par Eroos dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 03/05/2017, 10h15
  2. Boucle infinie en C
    Par Atry dans le forum Programmation et langages, Algorithmique
    Réponses: 4
    Dernier message: 15/11/2016, 13h37
  3. Aide TKINTER Python
    Par raroum dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 22/04/2016, 20h42
  4. python, tkinter, gestion d'événements
    Par Jack dans le forum Programmation et langages, Algorithmique
    Réponses: 11
    Dernier message: 29/10/2013, 11h34
  5. Python : pas moyen d'importer tkinter
    Par helium0xFF dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 10/09/2012, 13h26