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 :

Aucun retour sur appel d'une fonction d'un fichier à un autre [Python 3.X]


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien matériel biomédical
    Inscrit en
    Janvier 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien matériel biomédical

    Informations forums :
    Inscription : Janvier 2021
    Messages : 3
    Par défaut Aucun retour sur appel d'une fonction d'un fichier à un autre
    Bonjour les devs,

    il n' y a pas de sous-forum dédié à la présentation, mais je vais quand même faire une brève présentation ici.. Je m'appelle Fred, je viens du var, j'ai 35 ans, et j'ai débuté le python en novembre, j'ai appris en autodidacte, en me documentant avec des vidéos et pdfs, mais il me reste encore beaucoup à apprendre et à pratiquer. C'est pour cela que j'ai commencé à coder un petit programme avec lequel je compte évoluer et me faire la main sur lequel je rencontre une difficulté:

    Aujourd'hui je viens vers vous car je ne trouve pas de solution à mon problème, malgré avoir passé des heures à modifier le code et à tenter de trouver d'éventuelles erreurs...

    Explication de ce que doit faire mon code: Sur un fichier (ofp.py):Ouvrir une petite interface graphique (Tkinter) avec un champs et un bouton...simple.. Puis, dans une fonction, on récupère la valeur de l'entry pour l'injecter à la fin d'une url, quand on clique sur le button. Ensuite sur le main.py: Je souhaite récupérer l'Url par rappel de la fonction (qui redirigera vers une page xml qui contient des infos que par la suite j'essaierai d'extraire pour un tas de calcul et affichage dans une autre fenetre..)

    Mon petit soucis: c'est que l'appel de la fonction getsimbrief() dans le main.py ne me retourne rien en console, alors que si je run l'ofp.py avec un print(ofp) à la place du return ofp dans la fonction getsimbrief() j'ai bien l'url qui s'affiche en console, comme dans le screen ci dessous.

    Je code sous PyCharm.
    Nom : Sans titre-1.jpg
Affichages : 150
Taille : 61,9 Ko

    Les codes:
    ofp.py
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    from tkinter.ttk import *
    from tkinter import *
    from tkinter.messagebox import *
     
     
    #Fenetre principale du programme
    window = Tk()
    #Personnalistaion de la fenetre
    window.title("Entrez votre pseudo Simbrief")
    window.geometry("340x160+500+250")
    window.minsize(340, 160)
    window.maxsize(340, 160)
    window.iconbitmap("FMSINFO.ico")
    window.config(background="#376ca1")
    #Texte "Entrez votre pseudo Simbrief"
    ask_pseudo = Label(window, text="Entrez votre pseudo Simbrief", font=("comic sans ms", 15), bg="#376ca1", fg="white")
    ask_pseudo.place(x=25, y=10)
    wait = Label(window, text="Chargement de votre OFP..", font=("comic sans ms", 8), bg="#376ca1", fg="white")
    #Création de la frame (boite)
    frame_input = Frame(window, bg="#376ca1")
    #Champs input pseudo
    input_pseudo = Entry(frame_input, bg="white", font=("helvetica", 13))
    input_pseudo.grid(row=1, column=1) ##Alignement du champs sur la grille (grid)
     
    def getsimbrief():
      global input_pseudo
      if input_pseudo.get() == (""):
         showinfo(message=("Veuillez renseigner votre pseudo SimBrief."))
      else:
        ofp = ("http://www.simbrief.com/api/xml.fetcher.php?json1&username={}".format(input_pseudo.get()))
        # barre de progression (progressbar)
        wait.place(x=200, y=140)
        progressbar = Progressbar(window, orient="horizontal", mode="determinate")
        progressbar.place(x=220, y=120)
        progressbar.start(8)
      return ofp
     
    #Bouton "Import"
    import_button = Button(frame_input, text="IMPORT", font=("helvetica", 10), bg="#e22500",
                           fg="white", bd=1, padx=20, command=getsimbrief)
    import_button.grid(row=2, column=1) ##Alignement du bouton sur la grille (grid)
    frame_input.pack(expand=YES)
    #création de l'image du logo
    width = 90
    height = 70
    image = PhotoImage(file="FMSINFO.png").zoom(4).subsample(32)
    canvas = Canvas(window, width=width, height=height, bg="#376ca1", bd=0, highlightthickness=0)
    canvas.create_image(width/2, height/2, image=image)
    canvas.place(x=10, y=90)
     
    #Affichage de la fenetre
    window.mainloop()
    main.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from ofp import getsimbrief
    from xml.dom import minidom
     
    print(getsimbrief())
    Si vous pouvez apporter une réponse à mon problème..
    J'espère que tout est bien clair, et que j'ai posté comme il fallait. Si il manque des infos ou autre, n'hesitez pas...

    Cordialement, Fredo.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Salut,

    Citation Envoyé par Fredo834 Voir le message
    Puis, dans une fonction, on récupère la valeur de l'entry pour l'injecter à la fin d'une url, quand on clique sur le button. Ensuite sur le main.py: Je souhaite récupérer l'Url par rappel de la fonction
    Par définition, une fonction n'a pas de mémoire: si vous l'appelez une fois, elle ne se rappellera pas ce qu'elle à retourné la première fois sauf à le stocker dans un objet externe à la fonction (ayant une durée de vie plus grande).

    Après le problème est côté lancement de main.py... car si le programme ofp.py se termine, tout ce qu'il contient n'existe plus sauf à utiliser un stockage "persistant" comme un fichier.

    Citation Envoyé par Fredo834 Voir le message
    Mon petit soucis: c'est que l'appel de la fonction getsimbrief() dans le main.py ne me retourne rien en console, alors que si je run l'ofp.py avec un print(ofp) à la place du return ofp dans la fonction getsimbrief() j'ai bien l'url qui s'affiche en console, comme dans le screen ci dessous.
    from ofp import getsimbrief s'arrête à l'instruction window.mainloop() et attend la destruction de la fenêtre pour exécuter un jour print(getsimbrief()).

    Désolé on ne peut pas faire ce que vous envisagez tel que vous le voulez...
    Il faut apprendre à le faire avec ce que permet Python et tkinter.

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

  3. #3
    Candidat au Club
    Homme Profil pro
    Technicien matériel biomédical
    Inscrit en
    Janvier 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien matériel biomédical

    Informations forums :
    Inscription : Janvier 2021
    Messages : 3
    Par défaut
    Merci pour ton explication assez claire Wiztricks !
    Si je comprends bien, il faut que je trouve une solution afin de stocker la page web xml directement dans la fonction et ensuite je travaille dessus dans main.py . Je pourrais peut-etre stocker mon xml avec requests.get ? Enfin bon, je suis meme pas sûr que ce module peux stocker..il faut que je me renseigne..

    Je ne veux pas specialement le faire avec la methode que j'ai entrepris, je ne suis qu'un débutant en la matière, donc si vous avez des pistes pour une plus judicieuse facon de faire je suis preneur, je suis là pour apprendre de mes erreurs.

    Merci encore

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Fredo834 Voir le message
    Si je comprends bien, il faut que je trouve une solution afin de stocker la page web xml directement dans la fonction et ensuite je travaille dessus dans main.py .
    Pas vraiment. Car tout ce qui est stocké "dans une fonction" (hors globale) disparait quand la fonction se termine.
    Il faut bien voir une fonction comme un objet opaque et indépendant. On lui donne des éléments à traiter, elle les traite et retourne le résultat de son travail. Et c'est une bonne chose que ce soit ainsi car si son travail est assez utile, ça te permet de la réutiliser dans différents contextes.

    De plus il n'y a pas de connexion automatique entre deux programmes. Si P1 s'exécute puis se termine, tout ce qu'il n'aura pas sauvegardé dans un modèle de données persistant est perdu. Ceci dit, les outils persistants sont assez nombreux. Tu as par exemple le fichier disque, la base de données (Python possède nativement un moteur bdd nommé "sqlite" qui offre tous les avantages d'une vraie bdd excepté les accès concurrents) et ensuite il existe des outils de communication inter programmes comme le pipe, le socket, le réseau, les IPC.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Salut,

    Citation Envoyé par Fredo834 Voir le message
    je ne suis qu'un débutant en la matière, donc si vous avez des pistes pour une plus judicieuse facon de faire je suis preneur, je suis là pour apprendre de mes erreurs.
    Vous essayez de traduire un besoin avec une idée complètement inopérante de ce que peuvent être fonction et découpage d'un programme en parties.

    Inopérante... parce que çà ne marche pas comme çà.

    Une façon simple pour réaliser çà serait de déclencher l'activité de stockage de la page web depuis la fonction (qui accessoirement s'appelle "callback" parce qu'appelée par tkinter lorsque l'utilisateur clique sur le Button).

    Comme vous supposez qu'elle dure longtemps (puisque vous invitez l'utilisateur à patienter à l'affichage d'une ProgressBar, il faudra peut être que cette activité puisse être asynchrone (se déroule en parallèle sinon la progressbar sera juste figée)... Et pour faire çà, l'exécuter via un Thread.

    Ce qui pourrait être un découpage simple (il y en a d'autre)...
    Pour les détails, il y a des bons tutos... (pour apprendre les bases et comprendre comment çà marche pas juste recopier des lignes de code). Mais il va falloir prendre le temps d'apprendre.

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

  6. #6
    Candidat au Club
    Homme Profil pro
    Technicien matériel biomédical
    Inscrit en
    Janvier 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien matériel biomédical

    Informations forums :
    Inscription : Janvier 2021
    Messages : 3
    Par défaut
    Sve@r merci pour votre réponse, l'idée de stocker au travers d'une base Sql, j'y avais pensé pour le futur..je pense qu'en effet cela serait bien d'en profiter pour mon application de stockage. Je vais en apprendre davantage sur ce module et tenter de le maitriser.

    Wiztricks, j'ai bien noté tout vos conseils et il me parait évident qu'il me faut encore travailler le sujet des fonctions et surtout, celle du découpage, repertoire etc.. et d'aborder une toute autre approche comme vous me celle que vous évoquez. En tout cas, merci pour les conseils ! Je m'en vais étudier tout çà avant d'aller plus loin... En ce qui concerne le temps d'apprendre, je le prends le + possible, mais il est évident qu'avec une vie de famille bien chargée, ainsi qu'un métier très prenant, c'est moins facile de prendre son temps.. j'essaie aussi de mettre en pratique au fur et à mesure, car je sais que je progresse plus vite comme cela. Dans tout les cas je ne recopie jamais les codes bêtement, le peu de codage de ce programme que j'ai débuté proviens uniquement des connaissances que j'ai acquises, c'est juste que je n'ai pas les bonnes méthodes d'applications, car en effet, je veux surement aller trop vite..

    Allez je classe le sujet résolu puisque je vais tout revoir. Encore merci à vous deux, et peut-être à bientôt

    Cdlt, Fred.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel d'une fonction dans un fichier différent
    Par doudou34 dans le forum jQuery
    Réponses: 4
    Dernier message: 12/11/2011, 10h45
  2. appel d'une fonction en cliquant sur un lien
    Par pazaroti dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 17/04/2007, 13h20
  3. appel d'une fonction sur autre page
    Par champion dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/03/2007, 14h37
  4. Réponses: 5
    Dernier message: 06/01/2006, 11h41

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