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

Tkinter Python Discussion :

Code qui ne s'exécute qu'à la fermeture de la fenêtre root [Python 2.X]


Sujet :

Tkinter Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2007
    Messages : 53
    Points : 45
    Points
    45
    Par défaut Code qui ne s'exécute qu'à la fermeture de la fenêtre root
    Bonjour,

    Je suis d'un niveau débutant en programmation avec python 2.7.

    J'ai un code pour une GUI qui fait appel à un autre script python pour envoie de MMS, comme suit :

    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
     
    #!c:/Python27/python.exe -u
     
    import send_mms
    import sys
    from Tkinter import *
    import Tkinter as Tk
     
    root = Tk.Tk()
    root.title('MMS MM4 Inbound Test Tool')
     
    def send():
        send_mms.main(var.get(), v1.get(), v2.get())
     
    var = IntVar()
    frame1 = Frame(root)
    frame1.pack()
    frame2 = Frame(root)
    frame2.pack()
    frame3 = Frame(root)
    frame3.pack()
    frame4 = Frame(root)
    frame4.pack()
    R1 = Radiobutton(frame1, text="Send MMS to Prod MSISDN", variable=var, value=1)
    R1.pack( anchor = W )
    R2 = Radiobutton(frame1, text="Send MMS to Labo MSISDN", variable=var, value=2)
    R2.pack( anchor = W )
    L1 = Label(frame2, text="Enter Receiving MSISDN here :")
    L1.pack( side = LEFT)
    v1 = StringVar()
    E1 = Entry(frame2, bd =5, textvariable=v1)
    E1.pack(side = RIGHT)
    L2 = Label(frame3, text="Enter number of MMS to send:")
    L2.pack( side = LEFT)
    v2 = StringVar()
    E2 = Entry(frame3, bd =5, textvariable=v2)
    E2.pack(side = RIGHT)
    S = Button(frame4, text="Send", command=send)
    S.pack( anchor = W )
     
    root.mainloop()
    Quand on appuie sur le bouton send ça fait appel au script send_mms.py avec les bons arguments, celui ci doit envoyer les MMS avec le bon système choisi, le numéro de destination indiqué ainsi que le nombre de MMS voulus.

    Le script send_mms.py ressemble un peu à ça :

    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
     
    #!c:/Python27/python.exe -u
     
    import smtplib
    import time
    import os, sys
    from email.utils import formatdate
    from Tkinter import *
     
    def main(arg1, arg2, arg3):
         corps du code.....
         for x in range (1, num):
             smtpObj.sendmail(mailfrom, rcptto, message)
             status = "%d Successfully submitted MMS" % (x);
         frmMain = Tk()
         label = Label(frmMain, text = status)
         label.pack()
         frmMain.mainloop()
     
    if __name__=='__main__':
        sys.exit(main(sys.argv[1], sys.argv[2], sys.argv[3]))
    Où après l'envoi, une fenêtre pop-up pour indiquer l'envoi avec succès.

    Mais voilà sur la GUI quand en choisissant le système avec le bouton radio, entrant les champs num de tél + nombre de MMS et enfin cliquant sur le bouton send pour déclencher l'envoi, la fenêtre de succès pop-up mais rien ne se passe jusqu'à ce que je ferme cette fenêtre + la fenêtre de saisie aussi (avec le grand X à droite) ! et là je reçoit mes MMS...
    J'ai comme l'impression qu'un des deux programmes (ou les deux) entre dans une boucle qui n'est brisé que par la fermeture des fenêtres.
    J'ai essayé de placer des root.quit, root.destroy un peu partout mais ça donnait rien...
    Est ce que quelqu'un peut jeter un coup d’œil sur mon code et m'aider à trouver où se situe le bobo ?

    Merci d'avance,

  2. #2
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Salut,

    Je ne connais pas plus TK que ça (je suis plutot GTK). Par contre, pour coder des logiciels tous les jours, il y a une chose choquante dans ton code, c'est la répartition du code dans les fichiers.

    Dans du bon code, chaque module va correspondre à un type précis. Par exemple, dans ton cas, il te faut un module IHM (avec TK), et un avec juste l'emission de MMS.

    De plus, pour les IHM, elles sont lancées dans des process particulier (le mainloop en TK, ou main en GTK). Une fois cette boucle lancée, tu ne peux plus en lancer d'autre au sein de ton code. Hors si tu regarde bien, dans ton module de MMS, tu en lance une seconde, ce qui doit expliquer ton probleme.

    De fait, gère l'IHM dans ton premier module, et appelle l'envoi de MMS dans ton second, mais la fenetre de bonne emission du MMS doit etre géré dans le premier module.

    De plus, je me permet de te préciser qu'il vaut mieux expliquer le type d'encodage utilisé (surtout sous windows) avec la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: utf-8 -*-
    Sur la ligne 1 du code de chaque module
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2007
    Messages : 53
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par deusyss Voir le message
    Salut,

    Je ne connais pas plus TK que ça (je suis plutot GTK). Par contre, pour coder des logiciels tous les jours, il y a une chose choquante dans ton code, c'est la répartition du code dans les fichiers.

    Dans du bon code, chaque module va correspondre à un type précis. Par exemple, dans ton cas, il te faut un module IHM (avec TK), et un avec juste l'emission de MMS.

    De plus, pour les IHM, elles sont lancées dans des process particulier (le mainloop en TK, ou main en GTK). Une fois cette boucle lancée, tu ne peux plus en lancer d'autre au sein de ton code. Hors si tu regarde bien, dans ton module de MMS, tu en lance une seconde, ce qui doit expliquer ton probleme.

    De fait, gère l'IHM dans ton premier module, et appelle l'envoi de MMS dans ton second, mais la fenetre de bonne emission du MMS doit etre géré dans le premier module.

    De plus, je me permet de te préciser qu'il vaut mieux expliquer le type d'encodage utilisé (surtout sous windows) avec la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: utf-8 -*-
    Sur la ligne 1 du code de chaque module
    Merci pour tes conseils judicieux, en effet erreur de débutant (comme je ne suis pas un développeur...) ! J'ai modifié le send_mms.py comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    .............
       for x in range (1, num):
          smtpObj.sendmail(mailfrom, rcptto, message)
          status = "%d Successfully submitted MMS" % (x);
       return status
     
    if __name__=='__main__':
        status = sys.exit(main(sys.argv[1], sys.argv[2], sys.argv[3]))
    Puis le script de GUI comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ..........
    def send():
        status = send_mms.main(var.get(), v1.get(), v2.get())
        frmMain = Tk.Tk()
        label = Label(frmMain, text = status)
        label.pack()
        frmMain.mainloop()
     
    .............
    Et là ça marche parfaitement comme voulu ! J'ai même pu le transformer en bon exe avec cx_Freeze !
    Merci encore pour l'aide précieuse

  4. #4
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    De rien, au plaisir
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/05/2015, 16h20
  2. Code qui ne s'exécute plus
    Par sky88 dans le forum Android
    Réponses: 12
    Dernier message: 17/03/2015, 04h48
  3. [AC-2007] Code qui ne s'exécute pas
    Par Triad30 dans le forum VBA Access
    Réponses: 4
    Dernier message: 22/07/2010, 19h42
  4. code qui s excute une fois
    Par sisna dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 20/08/2008, 11h35
  5. [AJAX] code javascript qui ne s'excute pas
    Par backfire dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/05/2008, 15h10

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