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 :

Lancer et executer un script pour une durée déterminée


Sujet :

Tkinter Python

  1. #1
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut Lancer et executer un script pour une durée déterminée
    Bonjour à tous…
    Vous sous en seriez douté, mais j’ai un problème*! Avec Python (3.8)
    Voici l’ état des lieux.
    J’utilise tkinter. Et je programme en «*procédural*» (pas d’usage de Classes)
    Je ne peux pas vous donner le script intégral pour la bonne raison qu’il est tellement long que j’ai du le fractionner en plusieurs modules (des GUIs entre autres et des fonctions que j’importe pour alléger le script principal) en outre il y a plusieurs GUIs car trois fenêtres. Bref le script principal a 1500 lignes et les modules externes tous confondus totalisent pas loin de 2000 lignes. Impossible donc de vous donner l’intégralité des scripts car je suppose que les modérateurs me banniraient sans l’ombre d’un remord.
    Mais on peut simplifier la chose en restant dans l’abstrait
    Mon application (essentiellement des statistiques) utilise une quinzaine de touches claviers, se sont les touches ‘a’,’z’,’e’,’r’,’t’,’q’,’F12’ et les touches ‘KP_0’,’KP_1’, ‘KP_3’,’KP_4’, ‘KP_5’ et ’KP_6’ du pavé numérique. Plus quelques autres pour des réglages de préférences….
    Dans le script principal j’ai une fonction (nommée*: mon_filtre(event)
    Celle-ci répond aux touches pressées en fonction de contexte. (contexte est une variable pouvant prendre 5 valeurs différentes de 0 à 4) et pour chacune des situations possibles la fonction mon_filtre valide ou invalide l’utilisation de certaines des touches.
    Exemple*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if contexte == 1*:
    	if (lt!= ‘q’ and  lt!= ‘KP_4’ and lt!= ‘KP_5’ and lt!= ‘q’ and lt!= ‘KP_6’ and lt!= ‘t’)
    		return
    La fonction mon_filtre(event) se présente ainsi*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    mon_filtre(event)
    	global x,y,z…..
    	if contexte == 0*:
    		if lt == ‘F12’*:
    		…
    		if lt == ‘q’*:
    		...
    	…
    	…
    	…
    	if contexte == 4*:
    	…
    	return
    Et en fin de script on a l’appel en callback classique

    fen1.bind(«*<KeyPress>*»,mon_filtre)
    J’espère que vous avez accepté de me suivre jusqu’ici, et je remercie les courageux qui l’ont fait*!
    Maintenant mon problème.
    Le script (semble) fonctionner parfaitement. Reste à le tester.
    J’ai organisé la chose en ne me servant que de la touche ‘KP_1’ et une pression sur celle-ci appelle la fonction mon_filtre qui aiguille sur les fonctions souhaitées lesquelles vont lire des données sur une base externe.
    Vous avez bien lu*: moyennant une petite modification la simple pression de la touche «*KP_1*» suffit pour tester l’application. Mais les résultats ne deviennent intéressants qu’après quelques milliers d’actions sur la touche en question.
    Et ma question très simple se résume à ceci*: comment puis_je créer un mode «*AUTO*» qui lance le script indéfiniment*? Et aussi comment interrompre ce mode «*AUTO*» proprement c’est à dire juste avant l’ activation de la touche «*KP_1*»*?
    J’ai fait quelques essais(décevants) avec une boucle for x(in range (0, 2000)) ou une while infinie (mais cependant interruptible)
    Qui peut venir à mon secours*?
    Merci par avance à ceux qui vont me répondre.

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

    Citation Envoyé par azad2b Voir le message
    Et ma question très simple se résume à ceci*: comment puis_je créer un mode «*AUTO*» qui lance le script indéfiniment*? Et aussi comment interrompre ce mode «*AUTO*» proprement c’est à dire juste avant l’ activation de la touche «*KP_1*»*?
    Pas sur d'avoir tout compris... mais vous pouvez utiliser .event_generate pour simuler l'activation de votre touche, .after pour le répéter un certain nombre de fois et .after_cancel pour interrompre la répétition.
    Exemples à trouver en cherchant un peu sur Internet.

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

  3. #3
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,
    ... mais vous pouvez utiliser .event_generate pour simuler l'activation de votre touche, .after pour le répéter un certain nombre de fois et .after_cancel pour interrompre la répétition.
    Exemples à trouver en cherchant un peu sur Internet.
    W
    .event_generate, .after, .after_cancel, voilà des noms de méthodes qui font chaud au coeur. Mais hélas, mes recherches ont été vaines. En théorie je comprends l'idée de event_generate, mais je n'ai pas trouvé le moyen de l'utiliser.
    Alors si vous pouviez me donner un exemple très simple de l' utilisation de cette (ces) méthode, cela me ferait un grand plaisir/
    Par exemple
    j'ai une fonction

    def attend_sans_espoir(quelque_chose):
    ...
    ...


    je voudrais envoyer par code, et non par une frappe clavier, le caractère "z" à cette fonction.

    Donc quelque part je dois avoir une ligne qui ressemblerait à
    fenetre.event_generate("<<Key>>")
    avec les paramètres corrects
    et qui quand elle serait lue, enverrait mon caractère 'z' à la fonction qui se languit plus haut.
    J'ai fait pleins d'essais, qui tous ont échoués.
    Merci de votre réponse et à bientôt.
    PS Bien entendu la fonction appelée doit attendre un evenement, pas une variable ou la lettre 'z' directement

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    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
    import tkinter as tk
     
    def on_key(event):
        print('on_key', event.keysym, event.keycode)
     
    event_id = None
    def do_generate(delay=500):
        global event_id
        root.event_generate('<Key-K>', when='tail', keysym='K')
        event_id = root.after(delay, do_generate)
     
    def do_stop_generate():
        global event_id
        if event_id is not None:
            root.after_cancel(event_id)
            event_id = None
     
    root = tk.Tk()
    root.bind('<Key>', on_key)
    tk.Button(root, text='start', command=do_generate).pack()
    tk.Button(root, text='stop', command=do_stop_generate).pack()
    tk.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut
    Hé bien, que dire ?
    Le test de votre script m'a de suite montré qu' il répondait tout à fait à ce que je voulais obtenir. Et tout ( hum ... ou presque) s'est éclairci au vu de votre fonction on_key(event)
    C'est dans cette fonction, qui chez moi est au centre même de l'application, que je n'arrivais pas à passer les paramètres corrects qu'elle attendait. Et Python, pourtant assez loquace m'envoyait des messages auxquels je ne comprenais rien.
    Le gros avantage de votre solution, à part le fait qu'elle est bien plus lisible que mes magouilles, est qu'avec votre aide, je peux maintenant lancer mon script en mode automatique et en interrompre l'exécution sans risquer de polluer les fichiers de l'application.
    Je vous remercie infiniment et je vais maintenant adapter votre solution à mes problèmes.
    La question principale posée est ainsi résolue, mais je ne le clos pas pour autant car je crains, et j'espère avoir encore besoin de votre savoir.
    Ha autre chose, avant d'appeler au secours ici, j'avais tenté de m'informer sur Internet sur ce sujet, mais toujours je tombais sur des explications oiseuses, sans intérêt et totalement inutiles. Si vous professez le langage Python, vos élèves ont beaucoup de chance de vous avoir comme prof.
    A plus...

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par azad2b Voir le message
    mais toujours je tombais sur des explications oiseuses, sans intérêt et totalement inutiles
    Je ne comprends pas pourquoi vous cherchez des explications: tout est décrit dans la documentation TK.

    Après il faut juste prendre le temps d'écrire des exemples pour s'assurer qu'on a bien compris ce qui est écrit dans la documentation.

    Et quand tout va de travers, on a un "problème" c'est avec du code à poster ou une description qui permet de cherchez si quelqu'un n'est pas déjà tombé dedans.

    Citation Envoyé par azad2b Voir le message
    mais je ne le clos pas pour autant car je crains, et j'espère avoir encore besoin de votre savoir.
    Vous ouvrirez alors une autre discussion en fournissant la description du nouveau problème... Ceci pour respecter les règles du forum (un sujet par discussion) et aider les nouveaux qui cherchent ce genre de solution à ne pas trier dans un tas de replies plus ou moins décousus.

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

  7. #7
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut
    OK, je vais clore la discussion en déclarant la question comme résolue.
    Mais tout de même j’aimerais un peu clarifier ce qui n’est pas très clair pour vous.
    C’est vrai qu’il existe de la documentation sur Python, et c’est encore plus vrai qu’il y en a pour les centaines de librairies (dont tkinter) qui enrichissent ce langage.
    Vous semblez bien connaître Python, ce qui permet de supposer que vous aimez ce langage. Car c’est bien connu, on aime ce que l’on connaît et lycée de Versailles comme on dit. (vice et versa)
    Mon cas est un peu particulier, je programme généralement en C ( en c pas en c++) et j’étais un farouche utilisateur de MacOS et donc du MacIntosh. Mais changent les choses et changent les gens et justement les gens d’ Apple ont changé. MacOs ne reflétant plus l’esprit des fondateurs d’ Apple, j’ai totalement supprimé de mes Mac Pro les systèmes d’origine et j’en ai fait des machines dédiées à Linux. Faisant cela, j’ai perdu mon compilateur C qui était celui de MacOS (Objective C) bien sûr Linux ne manque pas de compilateurs C mais, et vous le savez parfaitement ni Linux, ni Windows n’ont la même ToolBox que celle de MacOS. Et justement c’était la seule que je connaissais à peu près correctement jusqu’à ce jour.
    Le programme dont je m’occupe oujourd’hui et pour lequel, vous m’avez aidé est assez ancien et ses sources sont spécifiques à MacOS.
    Il se trouve que j’ai des amis qui sont intéressés par cet utilitaire. Et ils sont pour la plupart utilisateurs de Windows.
    J’ai donc décidé de leur donner mon logiciel, mais pour cela il fallait qu’il puisse tourner chez-eux. Et c’est pourquoi, je me suis penché sur la solution Python, pour leur donner le script complet qu’ils pourront installer sur leur bécane.
    Python, cela fait moins d’un an que je le pratique, c’est pourquoi, je m’y suis attelé. Mais ce n’est qu’une passade, car soit dit entre-nous c’est un langage que je n’aime absolument pas.
    Je n’ai pas eu trop de mal à convertir la structure de mon programme dans ce nouveau langage, mais je l’ai fait sans me soucier de l’ élégance et du style. Maintenant je finalise et quand ce sera fait j’oublierais probablement ce que Python m’a fait enduré.
    Voilà, je sentais votre désapprobation quant à «*ma fainéantise intellectuelle*» et je comprends cela très bien. C’est pourquoi, j’ai voulu mettre les choses au point.
    Je vous remercie encore une fois pour votre aide, et vais retourner à mon passe temps favori*: développer des utilitaires, et rien d’autre.
    Merci encore mille fois. Peut être accepterez-vous à me venir en aide en cas de besoin.

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par azad2b Voir le message
    je sentais votre désapprobation quant à «*ma fainéantise intellectuelle*» et je comprends cela très bien. C’est pourquoi, j’ai voulu mettre les choses au point.
    Pas du tout.

    Je veux seulement dire qu'apprendre à lire une documentation n'est pas trivial: ça demande du temps et du savoir-faire.
    Et d'un autre côté, chercher sur Internet, c'est bien à condition de savoir ce qu'on cherche (et passé du temps à lire la documentation ou autres tutos).

    - 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. [eCommerce] Quel script pour une boutique en ligne ?
    Par Lareine dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 26/06/2009, 16h14
  2. Executer du code pendant une durée déterminé
    Par vladimire dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 21/12/2008, 11h32
  3. [Mail] Script pour une carte virtuelle
    Par pepsy dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2006, 09h35
  4. Script pour une Base Access
    Par Soulama dans le forum Access
    Réponses: 4
    Dernier message: 04/04/2006, 10h05
  5. Generer un script pour une BDD "*.sql"+"*.bat
    Par subzero82 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/08/2005, 16h47

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