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 :

Reprendre un programme apres fermeture fenetre


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Reprendre un programme apres fermeture fenetre
    Bonjour,

    Au sein d'un programme je crée un fenetre, qui me sert de boite de dialogue avec l'utilisateur qui sert a demander une valeur.
    J'aimerai qu'après avoir cliquer sur 'Ok' la programme continue car pour l'instant ben je detruit la fenetre puis plus rien! je vois pas comment faire pour que le programme continue...

    Voici un bout de mon code:

    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from Tkinter import *
    fen1=Tk()
    txt1= Label(fen1, text='Nombre de Truc a calculer')
    entr1= Entry(fen1)
    txt1.grid(row =0)
    entr1.grid(row =0, column =1)
    bou1= Button(fen1, text='Ok', command = fen1.destroy)
    bou1.pack()
    bou1.grid(row =1, column =1)
    fen1.mainloop()
    TrucACalculer = entr1
    ...

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    J'ai remarquer en faite qu'il bloque sur l'instuction mainloop() et attend meme si je renseigne le champ et clik 'ok'

  3. #3
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir XSquallX,

    Voici pour ta demande

    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
    from Tkinter import *
     
    class tonprog(Tk):
     
        def __init__(self):
            Tk.__init__(self)
            self.withdraw()
            self.trucacalculer = Label(self)
            self.trucacalculer.pack()
            Button(self, text='Quitter', command=self.quit).pack()
            self.intro()
     
        def valid(self):
            self.trucacalculer.config(text=self.entr1.get())
            self.fen1.destroy()
            self.deiconify()
     
        def intro(self):
            self.fen1=Toplevel()
            Label(self.fen1, text ='Nombre de Truc a calculer').pack()
            self.entr1 = Entry(self.fen1)
            self.entr1.pack()
            Button(self.fen1, text='Ok', command=self.valid).pack()
     
    if __name__== '__main__':     
        fen=tonprog()    
        fen.mainloop()
    Mais je te conseille de reprendre les tutos et de faire progressivement.
    Sans notions Python tu vas droit au mur.

    Et pense à Dernière modification par pacificator ; Aujourd'hui à 20h23. Motif: ajout des balises [code] (le #) ainsi qu'à l'indentation (Tu ne veux pas t'en charger pacificator ? Ah ? Ok ----------------->[]) .

    @+ et welcome.

  4. #4
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Et pense à Dernière modification par pacificator ; Aujourd'hui à 20h23. Motif: ajout des balises [code] (le #) ainsi qu'à l'indentation (Tu ne veux pas t'en charger pacificator ? Ah ? Ok ----------------->[]) .
    Elle est très bien cette indentation, non?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    ah mais je pensait pas ca si difficile en faite...!!
    Ben j'ai fait quelque tuto sur les fenetre c'est pour ca que j'y pensait à ma porter...
    Merci en tout cas

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    Bonjour,
    Que veux tu faire après la fermeture de la fenêtre, juste un calcul avec la valeur de l'Entry ou réafficher une fenêtre?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    ben ecoute non j'ai pas besoin de fenetre, j'affecte juste la valeur tapée à une variable et je m'en sert dans une boucle.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    J'ai remarquer en faite qu'il bloque sur l'instuction mainloop() et attend meme si je renseigne le champ et clik 'ok'
    En effet le mainloop est bloquant, jusqu'à ce que la fenêtre soit détruite. Ton problème vient du faite que ton Entry est détruite au moment ou tu veux récupérer sa valeur. Il faut donc récupérer sa valeur avant de détruire la fenêtre:
    Voici quelques idées:
    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
     
    from Tkinter import *
     
    def onOk():
    	global TrucACalculer
    	TrucACalculer = entr1.get()
    	fen1.destroy()
     
    fen1=Tk()
    txt1= Label(fen1, text='Nombre de Truc a calculer')
    entr1= Entry(fen1)
    txt1.grid(row =0)
    entr1.grid(row =0, column =1)
    bou1= Button(fen1, text='Ok', command = onOk)
    bou1.pack()
    bou1.grid(row =1, column =1)
    fen1.mainloop()
     
    print TrucACalculer
    #ici ta boucle
    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
     
    from Tkinter import *
     
    def onOk():
     
    	TrucACalculer = entr1.get()
    	fen1.destroy()
    	print TrucACalculer
    	#ici ta boucle
     
    fen1=Tk()
    txt1= Label(fen1, text='Nombre de Truc a calculer')
    entr1= Entry(fen1)
    txt1.grid(row =0)
    entr1.grid(row =0, column =1)
    bou1= Button(fen1, text='Ok', command = onOk)
    bou1.pack()
    bou1.grid(row =1, column =1)
    fen1.mainloop()
    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
     
    from Tkinter import *
     
    class MyApp(Tk):
        def __init__(self):
            Tk.__init__(self)
            self.createWidget()
            self.trucACalculer = ""
            self.mainloop()
     
        def createWidget(self):
            Label(self, text='Nombre de Truc a calculer').grid(row =0)
            self.entr1= Entry(self)
            self.entr1.grid(row =0, column =1)
            Button(self, text='Ok', command = self.onOk).grid(row =1, column =1)
     
        def onOk(self):
            self.trucACalculer = self.entr1.get()
            self.destroy()
     
        def getTrucACalculer(self):
            return self.trucACalculer
     
     
     
    app = MyApp()
     
    print app.getTrucACalculer()
    #ici ta boucle

  9. #9
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Effectivement si tu n'as besoin de ta fenêtre que pour récupérer la valeur de l'Entry les exemples de nyko77 suffisent.

    Je ne rajoute que quelques infos : Évite le mélange de gestionnaire de géométrie (pack/grid dans ton premier code) pour les items d'un même niveau.

    Dans la mesure du possible évite global (c'est la porte ouverte à toutes les fenêtres) si tu débute.
    Il existe bien des façons pour cela (self, closure, etc).

    Sur le premier code de niko77
    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
     
    from Tkinter import *
     
    def onOk():
    	TrucACalculer.set(entr1.get())
    	fen1.destroy()
     
    fen1=Tk()
     
    TrucACalculer=StringVar()
    TrucACalculer.set('')
     
    txt1= Label(fen1, text='Nombre de Truc a calculer')
    entr1= Entry(fen1)
    txt1.grid(row =0)
    entr1.grid(row =0, column =1)
    bou1= Button(fen1, text='Ok', command = onOk)
    bou1.grid(row =1, column =1)
    fen1.mainloop()
     
    print TrucACalculer.get()
    #ici ta boucle
    Ne te complique pas la vie avec trop de procédures.

    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
    from Tkinter import *
     
    class MyApp(Tk):
        def __init__(self):
            Tk.__init__(self)
            Label(self, text='Nombre de Truc a calculer').grid(row =0)
            self.entr1= Entry(self)
            self.entr1.grid(row =0, column =1)
            Button(self, text='Ok', command = self.onOk).grid(row =1, column =1)
            self.trucACalculer = ""
            self.mainloop()
     
        def onOk(self):
            self.trucACalculer = self.entr1.get()
            self.destroy()
     
        def getTrucACalculer(self):
            return self.trucACalculer
     
    app = MyApp()
    print app.getTrucACalculer()
    @pacificator: Si, si, elle est très bien. J'ai eu du mal à suivre au début mais je vais mis faire Sans rire, c'était juste pour taquiner (c'est rare de voir une modif pour rajout de balises).

    @+

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    PauseKawa, j'ai essayer ton code qui me parait le plus simple. Mais le problème reste le meme, le programme bloque sur le mainloop() et attent, il ne m'affiche même pas la valeurdemandé dans le print...

  11. #11
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Cela ne m'étonne pas en fait : L'utilisation d'une variable après la destruction de l'objet me semble tordue

    Je n'ai pas pas le temps ce soir mais une première ébauche.
    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
     
    from Tkinter import *
     
    class Mesvariables():
        TrucACalculer = None
     
    class MyApp(Tk):
        def __init__(self):
            Tk.__init__(self)
            Label(self, text='Nombre de Truc a calculer').grid(row =0)
            self.entr1= Entry(self)
            self.entr1.grid(row =0, column =1)
            Button(self, text='Ok', command = self.onOk).grid(row =1, column =1)
     
        def onOk(self):
            Mesvariables.TrucACalculer = self.entr1.get()
            self.destroy()
     
    app = MyApp()
    app.mainloop()
    print Mesvariables.TrucACalculer
    Ou

    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
    from Tkinter import *
     
    def onOk():
        global TrucACalculer # Berk.
        TrucACalculer=entr1.get()
        fen1.destroy()
     
    fen1=Tk()
    txt1= Label(fen1, text='Nombre de Truc a calculer')
    entr1= Entry(fen1)
    txt1.grid(row =0)
    entr1.grid(row =0, column =1)
    bou1= Button(fen1, text='Ok', command = onOk)
    bou1.grid(row =1, column =1)
    fen1.mainloop()
     
    print TrucACalculer
    @+

Discussions similaires

  1. Programme attend fermeture fenetre selection fichier
    Par andrebernard dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 03/05/2009, 07h08
  2. [DOS] Reprendre la main après le lancement d'un programme
    Par kimz dans le forum Scripts/Batch
    Réponses: 9
    Dernier message: 28/05/2007, 23h58
  3. [C#] Process toujours actif apres fermeture de la fenetre
    Par toxycyty dans le forum Windows Forms
    Réponses: 4
    Dernier message: 26/10/2006, 16h48
  4. Service ou programme actif apres fermeture de session
    Par SlideMT dans le forum Windows
    Réponses: 2
    Dernier message: 12/04/2006, 10h47
  5. get => pointeur null apres fermeture d'une sous-fenetre
    Par gorgonite dans le forum AWT/Swing
    Réponses: 15
    Dernier message: 11/02/2006, 21h42

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