Lancer un script python en appuyant sur un bouton Tkinter

Fermé
Kamy_0117 Messages postés 2 Date d'inscription mercredi 7 septembre 2022 Statut Membre Dernière intervention 7 septembre 2022 - Modifié le 8 sept. 2022 à 17:26
mamiemando Messages postés 33145 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 10 juin 2024 - 11 oct. 2022 à 15:37

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 22861 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 juin 2024 1 474
7 sept. 2022 à 21:35

bonjour,

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

0
Kamy_0117 Messages postés 2 Date d'inscription mercredi 7 septembre 2022 Statut Membre Dernière intervention 7 septembre 2022
7 sept. 2022 à 21:41

Non , ce code est celui de mon interface graphique.

0
yg_be Messages postés 22861 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 juin 2024 1 474 > Kamy_0117 Messages postés 2 Date d'inscription mercredi 7 septembre 2022 Statut Membre Dernière intervention 7 septembre 2022
7 sept. 2022 à 22:31
0
mamiemando Messages postés 33145 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 10 juin 2024 7 756
Modifié le 8 sept. 2022 à 17:47

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 mardi 11 octobre 2022 Statut Membre Dernière intervention 11 octobre 2022
Modifié le 11 oct. 2022 à 15:38

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 mardi 11 octobre 2022 Statut Membre Dernière intervention 11 octobre 2022 > Nanosaure Messages postés 2 Date d'inscription mardi 11 octobre 2022 Statut Membre Dernière intervention 11 octobre 2022
11 oct. 2022 à 05:53

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

0
mamiemando Messages postés 33145 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 10 juin 2024 7 756
Modifié le 11 oct. 2022 à 15:57

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