Lancer un script python en appuyant sur un bouton Tkinter

Kamy_0117 Messages postés 2 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -

Bonjour,

Je suis sur un projet en python mais j'ai un problème.

Je souhaite ouvrir un programme python (fiher.py) avec un bouton Tkinter, mais je ne trouve aucune documentation à ce sujet. Tout aide sera merveilleux pour moi. Merci d'avance. 

Le code:

from tkinter import *


window = Tk()

window.title("Formulate")
window.geometry("1080x720")
window.minsize(680, 560)
window.config(background='#2AAD57')

frame = Frame(window, bg='#2AAD57')

label_title = Label(frame, text="Bienvenue", font=("Courrier", 40), bg='#2AAD57', fg="#FFFFFF")
label_title.pack(expand=YES)

label_subtitle = Label(frame, text="Formulaire de registration", font=("Courrier", 25), bg='#2AAD57', fg="#FFFFFF")
label_subtitle.pack(expand=YES)

play_button = Button(frame, text="Commencer", font=("Courrier", 25), bg='#FFFFFF', fg="#2AAD57")
play_button.pack(pady=25,fill=X)

frame.pack(expand=YES)

window.mainloop()

3 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    bonjour,

    le code que tu présentes, c'est celui de fiher.py?

    0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     

    Bonjour,

    Pour compléter la réponse d'yg_be, les boutons dans Tkinter ont un paramètre command qui permet d'appeler une fonction passée en paramètre (callback).

    Exécuter un autre script python

    Si on suit l'idée proposée par ug_be Il suffit que la callback lance cet autre programme python (par exemple à l'aide de subprocess.call).

    my_script.py

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    print("coucou")


    Le fichier doit avoir des droits en exécution. Sous Linux :

    chmod a+x my_script.py

    gui.py

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import subprocess
    from tkinter import *
    
    def my_callback():
        subprocess.call("./my_script.py", shell=True)
    
    window = Tk()
    button = Button(window, text="start", command=my_callback)
    button.pack()
    window.mainloop()

    Ce fichier doit être dans le même dossier que my_script.py.

    Exécuter une fonction codée dans un autre module python

    C'est une solution plus élégante que la précédente. En effet, on préfère généralement qu'une fonctionnalité soit enveloppée dans une fonction, ce qui en facilite l'appel et la rend plus facile à réutiliser. On pourrait donc modifier l'exemple précédent ainsi :

    my_lib.py

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    def my_function():
        print("coucou")

    gui.py

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    from my_lib import my_function
    from tkinter import *
    
    window = Tk()
    button = Button(window, text="start", command=my_function)
    button.pack()
    window.mainloop()

    Ce fichier doit être dans le même dossier que my_lib.py.

    Bonne chance

    0
    1. Nanosaure Messages postés 2 Statut Membre
       

      mamiemando bonjour, 

      Juste une précision: si , dans le première version, ./my_script.py doit avoir des arguments : comment les ajoute-t'on ? Le mieux serait en plus d'avoir des camps à remplir qui s'ajoutent automatiquement... Mais je vais avancer par étape.. 
       

      0
      1. Nanosaure Messages postés 2 Statut Membre > Nanosaure Messages postés 2 Statut Membre
         

        Ca y est j'ai compris: entre crochets, entre guillemets, et virgule entre chaque argument....

        0
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     

    Bonjour,

    Par rapport aux messages #5 et #6 : qui dit nouvelle question dit nouveau fil de discussion pour garder le forum propre.

    Récupérer arguments passés en paramètres en script

    Les arguments passé en paramètre au script sont mémorisés dans la liste sys.argv ; tu peux donc itérer dessus ou utiliser l'opérateur [] pour accéder à un argument particulier.

    Exemple :

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import sys
    
    def main():
        for (i, arg) in enumerate(sys.argv):
            print(f"Argument {i}: '{arg}'")
        print(sys.argv[0])
    
    if __name__ == "__main__":
        main()

    Résultat :

    python3 toto.py arg1 "arg ument 2" arg3
    Argument 0: 'toto.py'
    Argument 1: 'arg1'
    Argument 2: 'arg ument 2'
    Argument 3: 'arg3'
    toto.py

    Demander les arguments à l'exécution

    Si tu veux demander des valeurs à l'exécution, encore faut-il savoir combien tu veux en demander. Il faut demander cette valeur à l'utilisateur, mais comme on n'est pas sûr qu'il va saisir un entier positif, il faut contrôler que la chaîne de caractère qu'il a saisi est conforme. Ensuite tu peux demander les arguments en fonction de cet entier.

    C'est ce que fait le code ci-dessous. Seul le nombre d'argument est contrôlé, car on n'a pas d'hypothèse à vérifier concernant le type des arguments saisis par la suite. On se contente de mémoriser la chaîne de caractère saisie.

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import sys
    
    def input_int(label:str = "", test = None) -> int:
        while True:
            s = input(label)
            try:
                n = int(s)
                if test and test(n):
                    return n
                else:
                    print(f"Saisie invalide ({s})", file=sys.stderr)
            except ValueError as e:
                print(f"Saisie invalide ({s}): {e}", file=sys.stderr)
                pass
     
    def main():
        num_args = input_int("Nombre d'arguments ? ", lambda x: x > 0)
        args = [
            input(f"Argument {i + 1} ? ")
            for i in range(num_args)
        ]
        print(args)
                  
    if __name__ == "__main__":
        main()

    Résultat :

    python3 toto.py
    Nombre d'arguments ? abc
    Saisie invalide (abc): invalid literal for int() with base 10: 'abc'
    Nombre d'arguments ? -2
    Saisie invalide (-2)
    Nombre d'arguments ? 3
    Argument 1 ? arg1
    Argument 2 ? arg ument 2           
    Argument 3 ? arg3
    ['arg1', 'arg ument 2', 'arg3']

    Bonne chance

    0