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

Python Discussion :

Lancer un script depuis un autre script (Tkinter)


Sujet :

Python

  1. #1
    Membre habitué Avatar de 6mxw9
    Homme Profil pro
    Menuisier
    Inscrit en
    Août 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Menuisier

    Informations forums :
    Inscription : Août 2020
    Messages : 9
    Par défaut Lancer un script depuis un autre script (Tkinter)
    Bonjour à tous !

    Pour ceux qui on suivit ma présentation, je suis un vrai débutant dans le langage Python. Alors, je vous demanderai s'il vous plait de ne pas trop utiliser de terme "pro" pour éviter que je sois trop largué Merci d'avance ! ^^ Et ne vous moquez pas, mon "projet" est, j'imagine pour vous, ultra simple, mais pour moi c'est un vrai défi

    Donc, commençons par le commencement.

    J'ai déjà réalisé grâce à Tkinter, à créer une interface graphique ainsi qu'un menu. Donc, j'ai "Fichier, Edition, etc...", ce genre de menu qu'on a en haut de la fenêtre. Et avec ça, des sous menu.

    Sur l'un d'eux, j'ai réussi à diriger vers mon site web (avec 'webbrowser'). Maintenant, j'aimerai pouvoir, en cliquant sur l'un des sous menus, ouvrir un script qui serait sur un autre fichier.

    Pour être plus précis, j'ai un menu "Générateur", et des sous menu "Citation", "Répliques", et...

    En cliquant sur le sous-menu "Citation", j'ouvre une nouvelle fenêtre (liée à la fenêtre principale). Voyez la capture d'écran :

    (bon, je n'arrive pas à afficher l'image, je vous donne le lien) : Cliquez pour voir la capture

    Donc vous l'aurez compris, en cliquant sur le sous menu "Citation", j'aimerai que la nouvelle fenêtre ouvre un script d'un autre fichier. Comme ça, j'aurai moins de liges de code dans le même fichier, j'aurai chaque "programme", indépendant.

    Pour vous, afin d'avoir le maximum d'info, est-ce qu'il vous faut le fichier que j'ai créer ou alors simplement un copié collé du code ?

    EDIT :

    Petite question en passant, quand j'ai lancé mon script via mon terminal, ma fenêtre du programme s'ouvre très bien. En revanche, je ne peux pas faire 'cmd + w' pour fermer, comme pour une fenêtre habituelle. Une idée ?
    Etonnement, ça fonctionne maintenant... Je ne sais pas ce qui s'est passé, un simple bug de mon mac, probablement.

    Je vous remercie par avance de votre aide !

  2. #2
    Membre Expert
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Par défaut
    Salut,
    je ne sais pas si j'ai bien tout compris mais pourquoi ne pas ajouter en haut de ton code d'appel :
    qui permet de récupérer le contenu de monscript.py
    Et à partir de là, tu récupères toutes les méthodes du fichier que tu pourras utiliser dans ta nouvelle fenêtre TKinter

  3. #3
    Membre habitué Avatar de 6mxw9
    Homme Profil pro
    Menuisier
    Inscrit en
    Août 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Menuisier

    Informations forums :
    Inscription : Août 2020
    Messages : 9
    Par défaut
    Salut, merci pour ta réponse.

    Je comprends un peu ce que tu veux dire, mais cet import, je dois le mettre en haut de quel script ?

    Car, pour essayer d'être plus clair dans ce que je veux expliquer, mon script principal possède du code pour créer un menu. Dans cette partie du code, j'ai fais un "toplevel" pour ouvrir une nouvelle fenêtre "enfant" à la principale. Mais à aucun moment je ne lui ai dit d'ouvrir un autre fichier, comment est-ce que cette nouvelle fenêtre peut elle déterminer quel script elle doit lancer ?

  4. #4
    Membre Expert
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Par défaut
    Eh bien, dans ton code principal. TopLevel est une fenêtre de l'application alors que Tk est la racine de l'application.

  5. #5
    Membre habitué Avatar de 6mxw9
    Homme Profil pro
    Menuisier
    Inscrit en
    Août 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Menuisier

    Informations forums :
    Inscription : Août 2020
    Messages : 9
    Par défaut
    Exact, j'ai fait ce que tu as dit et ça m'a bien lancer le script secondaire (je vais l'appeler comme ça, ça sera plus simple pour comprendre).

    Seulement, quand je lance mon script principal, et bien il exécute forcement l'import du script secondaire, et il le fait dès le lancement du script principal. Or, ce que j'aimerai, c'est que ce script secondaire se lance seulement quand on clique sur le sous menu dédié.

    Je suis désolé, j'ai du mal à expliquer facilement ce que je souhaite :/

  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
    Salut,

    Citation Envoyé par 6mxw9 Voir le message
    Or, ce que j'aimerai, c'est que ce script secondaire se lance seulement quand on clique sur le sous menu dédié.
    import ne lance pas un programme mais charge un module externe (et une seule fois).

    Essayez de faire plusieurs fois l'import d'un script ne contenant que:
    Par contre si vous emballez le "print" dans une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def f():
        print('coucou')
    vous allez pouvoir appeler plusieurs fois la fonction "f" (après un from script import f)

    Si vous voulez que module soit aussi programme, l'astuce est de tester __name__ pour savoir s'il est exécuté ou s'il est importé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def f():
        print('coucou')
    if __name__ == '__main__':
       f()
    Dit autrement un module n'est pas un programme... même si on peut "adapter" les cas de figures çà peut demander pas mal de corrections (à votre code) pour que çà marche.

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

  7. #7
    Membre habitué Avatar de 6mxw9
    Homme Profil pro
    Menuisier
    Inscrit en
    Août 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Menuisier

    Informations forums :
    Inscription : Août 2020
    Messages : 9
    Par défaut
    Bonjour et merci pour cette réponse.

    Si j'ai bien compris, il faudrait que je mette mon script de générateur de citation (par exemple) dans une 'def' ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def generateur():
                     ici le code du script
    Est-ce bien ça ? Même si dans ce script de générateur, j'ai déjà des "def" ?

    Et après, je peux appeler cette fonction "generateur" de la même façon que j'ai appelé le "webbrowser" pour ouvrir une page web ?

    EDIT :

    Bon, en suivant ton conseil, je suis parvenu à faire plus ou moins ce que je veux. J'ai mon script principal, je l'exécute, une fenêtre s'ouvre. Je navigue dans le menu, je clique sur un sous menu, et une nouvelle fenêtre s'ouvre avec mon script secondaire.

    Seulement, tout est dans le même script, et non sur deux fichier séparé... Est-ce que vous voyez ce que je veux dire ?

    Mon interface principale serait comme une page de présentation, puis en allant dans les menus, on choisi le programme à ouvrir, mais ce programme serait sur un autre fichier .py. Là, ce que j'ai fait, tout est sur le même fichier (aussi bien la page principale que le programme secondaire).

    Mais ça avance !

  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
    Salut,

    Citation Envoyé par 6mxw9 Voir le message
    Là, ce que j'ai fait, tout est sur le même fichier (aussi bien la page principale que le programme secondaire).
    C'est le plus facile.

    Après si vous voulez découper votre code pour le ranger dans plusieurs modules (fichiers), vous n'allez pas pouvoir le faire n'importe comment sauf si le script secondaire ne contient que des fonctions pures (qui ne dépendent pas de variables "externes" autres que celles passées en paramètres ou créés dans la fonction)

    tkinter ajoute ses complications par dessus.

    Une fonction pourra créer ses widgets et leur associer des actions (qui appelleront d'autres fonctions).
    A l'appel de cette fonction, il faudra lui indiquer dans quoi créer les widgets (une fenêtre, une Frame,...) histoire que l'appelant sache quoi faire pour afficher/masquer/détruire (on dit gérer) ce qui se passe "derrière".

    Définir la fonction à appeler et les paramètres à appeler, c'est ce qu'on appelle une interface.
    C'est pas plus compliqué qu'une prise de courant (côté mâle et cote femelle) mais en programmant vous passez de l'utilisateur qui se contente de comprendre comment çà marche pour s'en servir au créateur qui doit décider ce que doivent faire/inclure/comporter côté mâle et côté femelle pour que çà s'emboîte.

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

  9. #9
    Membre Expert
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Par défaut
    Le plus simple pour toi ici, serait dans ton script d'appel, de créer une classe citation (faire de l'orienté objet)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Class Citation()
    .....
    et dans ton script principal et dans ta Toplevel, déclarer une instance de cette classe qui ferait le boulot demandé.
    Pour aller plus loin, définir une superclasse générale qui aurait les méthodes commune à tous tes sous-menus et créer des sous classes par héritage plus spécialisées qui ferait Citation etc...
    C'est le genre de truc où la POO est très utile.

  10. #10
    Membre habitué Avatar de 6mxw9
    Homme Profil pro
    Menuisier
    Inscrit en
    Août 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Menuisier

    Informations forums :
    Inscription : Août 2020
    Messages : 9
    Par défaut
    Woaw... Merci à vous pour les conseils, mais je vous avoue que là, ça me dépasse ^^ Je vais, pour le moment, me contenter de tout faire dans le même fichier, ça fonctionne, donc ça me va.

    Plus tard, quand j'aurai appris un peu mieux tout ça, je verrai pour modifier.

    Je vais déjà faire mes générateurs, la suite, on verra !

    Merci encore !

Discussions similaires

  1. [Batch] Lancer un batch depuis un autre avec les variables du premier
    Par mr_samy81 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 08/04/2009, 15h40
  2. Réponses: 4
    Dernier message: 15/06/2007, 19h59
  3. [Maven2] Lancer un plugin depuis un autre plugin
    Par romaintaz dans le forum Maven
    Réponses: 10
    Dernier message: 23/04/2007, 17h13
  4. Lancer une action depuis une autre action
    Par anaon dans le forum Struts 1
    Réponses: 6
    Dernier message: 04/08/2006, 19h38
  5. Réponses: 5
    Dernier message: 06/07/2006, 10h02

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