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 :

arrter l'execution d'un script en attendant une entrée utilisateur


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 19
    Points : 19
    Points
    19
    Par défaut arrter l'execution d'un script en attendant une entrée utilisateur
    Bonjour tous,

    Voici ma problèmatique,

    Pour illustrer:

    J'ai une fenetre avec un button Tkinter.
    Lorsque je clique sur ce button, l'event associé est une simple boucle for de range 1000.

    Je voudrais que, disons à la 500e boucle, que la boucle for s'arrete tant que l'utilisateur n'aura pas rentrer une valeur.

    Donc dans cette boucle à un certain moment, je vais créer une nouvelle feneter avec un entry et un bouton "ok". Le problème, c'est que une fois cette fenetre crée, la boucle for continue, alors que je voudrais qu'elle attende que l'utilisateur est rentrée la valeur dans l'entry et presser le boutton ok, le tout renvoyant la valeur dans la boucle for pour pouvoir l'utiliser.

    Merci de votre aide, si vous m'avez compris...

    R.

  2. #2
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Salut,

    Tu as donc deux problèmes à prévoir, non seulement il faut attendre la fermeture de la fenêtre, mais il faut aussi pouvoir récupérer ta saisie ensuite.

    Une petite démonstration commentée, l'astuce se trouve dans la méthode wait_window pour la pause, et on dérive la classe Toplevel pour stocker la saisie de l'utilisateur.
    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
     
    class PopUp(Toplevel):
    	def __init__(self):
    		Toplevel.__init__(self)
    		self.title("Popup Tkinter")
    		self.resizable(height=False, width=False)
    		# redirige tous les évènements vers le popup
    		# ce qui rend la fenêtre "root" temporairement inactive
    		self.grab_set()
    		self.transient(root) # fenêtre "enfant" de la fenêtre root
     
    		self.saise = Entry(self, bg="white")
    		self.saise.pack(padx=5, pady=5)
    		self.saise.bind("<Return>", self.sortie)
     
    		Button(self, text="Valider", command=self.sortie).pack()
    		self.texte = None
     
    	def sortie(self, event=None):
    		self.texte = self.saise.get()
    		self.destroy()
     
    def start():
    	for i in xrange(10):
    		print i
    		if i == 5:
    			# on stock la référence vers la fenêtre Toplevel
    			p = PopUp()
    			print "-> pause"
    			# on bloque le flux d'exécution tant que le Toplevel existe
    			# c'est à dire tant que la méthode "destroy" n'a pas été appelée, 
    			# mais la référence p existe toujours, et on va pouvoir s'en servir 
    			# pour récupérer la saise APRÈS destruction du Toplevel
    			root.wait_window(p)
    			if p.texte is None:
    				print "Pas de saise"
    			else:
    				print "Le texte saisi est :", p.texte
     
    root = Tk()
     
    Button(root, text="click", command=start).pack(padx=30, pady=30)
    root.mainloop()

  3. #3
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Points : 388
    Points
    388
    Par défaut
    Bonjour,
    Ou bien :
    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
     
    class PopUp(Toplevel):
        def __init__(self):
            Toplevel.__init__(self)
            self.title("Popup Tkinter")
            self.resizable(height=False, width=False)
            # redirige tous les évènements vers le popup
            # ce qui rend la fenêtre "root" temporairement inactive
            self.grab_set()
            self.transient(root) # fenêtre "enfant" de la fenêtre root
     
            self.saise = Entry(self, bg="white")
            self.saise.pack(padx=5, pady=5)
            self.saise.bind("<Return>", self.sortie)
     
            Button(self, text="Valider", command=self.sortie).pack()
            self.texte = None
     
        def sortie(self, event=None):
            self.texte = self.saise.get()
            self.destroy()
     
    def gen(x):
        while True:
            result = yield x
            x+=1
            if result != None:
                x=result
     
    def start():
        toto=gen(10)
        for i in range(20):
            print toto.next()
        p=PopUp()
        root.wait_window(p)
        if p.texte is None:
                print "Pas de saise"
        else:
            print "Le texte saisi est :", p.texte
            print toto.send(int(p.texte))
            for i in range(20):
                print toto.next()
     
    root = Tk()
     
    Button(root, text="click", command=start).pack(padx=30, pady=30)
    root.mainloop()
    le tout renvoyant la valeur dans la boucle for pour pouvoir l'utiliser
    L'ulisation de "yield" me parait plus adaptée dans ce cas.

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/04/2014, 15h03
  2. Réponses: 10
    Dernier message: 24/08/2012, 17h54
  3. [samba]execution d'un script shell sur une partition
    Par tntneo dans le forum Réseau
    Réponses: 1
    Dernier message: 15/04/2010, 11h44
  4. Réponses: 4
    Dernier message: 26/04/2008, 01h29
  5. resultat de l'execution d'un script DOS dans une fenetre Java
    Par ledawa dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 26/03/2008, 17h51

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