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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 741
    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 741
    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 741
    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 741
    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 741
    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 741
    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

+ 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