Lancer un script python en appuyant sur un bouton Tkinter

Kamy_0117 Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33769 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()
A voir également:

3 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 

bonjour,

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

0
Kamy_0117 Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 

Non , ce code est celui de mon interface graphique.

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Kamy_0117 Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
0
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 879
 

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
Nanosaure Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 

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
Nanosaure Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   > Nanosaure Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 

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

0
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 879
 

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