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 :

Freeze de la fenêtre quand j'apelle une fonction


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    L1 MI
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : L1 MI

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Points : 17
    Points
    17
    Par défaut Freeze de la fenêtre quand j'apelle une fonction
    Bonjour / Bonsoir,

    J'apprends à programmer en python et je rencontre un petit problème,

    je voudrais quand on rentre une valeur incorrect dans une Entry() que le fond devienne rouge pendant une seconde puis qu'elle soit vidée. Avec le code ci dessous, la bouton qui vérifie reste figé pendant une seconde avec le curseur, le fond ne change pas de couleur mais le text est bien effacé à la fin.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	def signaleErreur(self, entre):
    		entre.configure(bg ='red')							
    		self.after(1000, self.videEntre(entre))	
     
    	def videEntre(self, entre):
    		entre.configure(bg ='white')		
    		entre.delete(0,END)

    Donc vu que je ne comprends pas pourquoi cela ne fonctionne pas je fais appel à vous, 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 : 41
    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,

    Alors là il va etre difficile de t'aider dans la mesure ou tu ne nous donne pas du tout l'integralité du code. Nous ne pouvons deviner le reste, et donc rechercher l'erreur. Il nous faudrait aussi ton os et la version de python utilisée.

    L'utilisation de self, indique que le code posté fait partie d'une classe. En general, un freeze intervient sous deux principales raisons (de mon experience vecue):
    =>Probleme de codage et le code "bloque"
    =>Probleme de communication entre process (utilisation de threads).

    Pour détecter une valeur incorrecte, tu dois utiliser une REGEX. En cas de mauvaise saisie, la façon la plus propre de procéder est la suivante:
    =>passage du fond en rouge
    =>Declenchement d'un timer de X secondes
    =>Dans le corps du timer:
    ------>supprimer le contenu
    ------>passer le fond à blanc
    ------>eteindre le timer

    Je ne suis pas expert en tkinter. En pygtk cependant, on utilise gobject.timeout_add, si cela peut aider.

  3. #3
    Membre à l'essai
    Homme Profil pro
    L1 MI
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : L1 MI

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    Salut et merci pour la réponse !

    J'utilise python 3.2 et en os : elementary os

    Voici le code complet :

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    from tkinter import *
    from tkinter.filedialog import asksaveasfile, askopenfile
     
    class Application(Tk):
    	def __init__(self, boss=None):
    		Tk.__init__(self)
    		self.dic = {}
    		self.title('Dictionnaire de couleurs')
     
    		# Affichage de tout le bazar 
    		Label(self, text='Nom de la couleur').grid(row=0, column=0)
    		Label(self, text='Code hexadécimal').grid(row=1, column=0)
    		self.entre1 = Entry(self, width =10)				# pour la couleur
    		self.entre2 = Entry(self, width =10)				# pour le code hexadécimal
    		self.entre1.grid(row=0, column=1)
    		self.entre2.grid(row=1, column=1)
    		Button(self, text='Tester', command=self.Affiche).grid(row=1, column=3)
    		self.can = Label(self, bg ="white", width =45, height =7, relief = SUNKEN)
    		self.can.grid(row=2, column=0, columnspan=4)
    		Button(self, text='Ajouter la couleur au dictionnaire', command=self.Add).grid(row=3, column=1)
    		self.but2 = Button(self, text='Enregistrer le dictionnaire', command=self.saveDico)
    		self.but2.grid(row=3, column=0, columnspan=1)
    		self.but3 = Button(self, text='Restaurer un dictionnaire', command=self.recupDico)
    		self.but3.grid(row=3, column=2, columnspan=3)
    		Button(self, text='Existe déjà ?', command=self.verif).grid(row=0, column=3)
     
    	def verif(self):
    		coul = self.entre1.get()
    		if coul in self.dic:
    			self.can.config(bg =self.dic[coul], text ="")
    		else:
    			self.can.config(text ="%s : couleur inconnue" % coul, bg='white')
     
    	def Add(self):
    		self.coul, self.code = self.entre1.get().strip(), self.entre2.get().strip()
    		try:
    			self.can.configure(bg=self.code, text='')
    			if len(self.coul)<1:
    				self.signaleErreur(self.entre1)
    				self.can.config(text ="Nom incorrect", bg ='white')
    			else:
    				self.dic[self.coul] = self.code
    		except:
    			self.signaleErreur(self.entre2)
    			self.can.config(text ="Codage de couleur incorrect", bg ='white')
     
    	def Affiche(self):
    		try:
    			self.code = self.entre2.get().strip()
    			self.can.configure(bg=self.code, text='')
    		except:
    			self.signaleErreur(self.entre2)
    			self.can.config(text ="Codage de couleur incorrect", bg ='white')
     
    	def signaleErreur(self, entre):
    		entre.configure(bg ='red')
    		self.after(1000, self.videEntre(entre))
     
    	def videEntre(self, entre):
    		entre.configure(bg ='white')	
    		entre.delete(0,END)
     
    	def signaleErreurB(self, bouton):
    		bouton.configure(bg='red')
    		self.after(1000, self.signaleErreurBo(bouton))
     
    	def signaleErreurBo(self, bouton):
    		bouton.configure(bg='light grey')
     
    	def recupDico(self):
    		f1 =askopenfile(filetypes=[("Texte",".txt"),("Tous","*")])
    		a = f1.read()
    		f1.close()
    		a = a.split('\n')
    		for car in a:
    			try:
    				car = car.split('@')
    				self.dic[car[0]] = car[1]
    			except:
    				break
     
    	def saveDico(self):
    		if len(self.dic.keys())>0:
    			f1 =asksaveasfile(filetypes=[("Texte",".txt"),("Tous","*")])
    			for clef, valeur in self.dic.items():
    				f1.write("{}@{}\n".format(clef,valeur))
    			f1.close()
    		else:
    			self.signaleErreurB(self.but2)
    			self.can.configure(bg=white, text='Aucune donnée dans le dictionnaire')
     
    if __name__ == '__main__':
    	Application().mainloop()
    Je vais me renseigner pour utiliser un timer merci

  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 : 41
    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
    Comme je l'ai dit plus tôt je ne suis pas expert TK loin de là. Cependna,t un peu de recherhce m'ont amené au fait que l'équivalent du gobject.timeout_add, en TK, semble etre la fonction "after".

    Regarde donc du coté de cette piste qui devrait te convenir j'espère. Pour le reste, applique la procédure que je t'ai indiqué et je pense que cela devrait resoudre tes problemes.

  5. #5
    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,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	def signaleErreur(self, entre):
    		entre.configure(bg='red')
    		# entre.update() # Ligne inutile si vous ne modifiez pas la suivante
    		self.after(1000, lambda: self.videEntre(entre))
    Pour information self.after(1000, self.videEntre(entre)) équivaut à self.after(1000, None), soit self.after(1000) qui est une pause de 1000, car self.videEntre(entre) retourne None.

    Parcourez le forum pour ce qui est de after et lambda.

    @+

  6. #6
    Invité
    Invité(e)
    Par défaut plus simple encore
    Citation Envoyé par PauseKawa Voir le message
    Bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	def signaleErreur(self, entre):
    		entre.configure(bg='red')
    		# entre.update() # Ligne inutile si vous ne modifiez pas la suivante
    		self.after(1000, lambda: self.videEntre(entre))
    Pour information self.after(1000, self.videEntre(entre)) équivaut à self.after(1000, None), soit self.after(1000) qui est une pause de 1000, car self.videEntre(entre) retourne None.

    Parcourez le forum pour ce qui est de after et lambda.

    @+
    Y a plus simple encore :

    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
     
     
        def signaleErreur(self, entre):
            entre.configure(bg ='red')
            self.after(1000, self.videEntre, entre)
     
        def videEntre(self, entre):
            entre.configure(bg ='white')
            entre.delete(0,END)
     
        def signaleErreurB(self, bouton):
            bouton.configure(bg='red')
            self.after(1000, self.signaleErreurBo, bouton)
     
        def signaleErreurBo(self, bouton):
            bouton.configure(bg='light grey')
    Merci la doc officielle Tkinter :

    http://infohost.nmt.edu/tcc/help/pub...universal.html

    Extrait :

    26. Universal widget methods

    The methods are defined below on all widgets. In the descriptions, w can be any widget of any type.

    w.after(delay_ms, callback=None, *args)
    Requests Tkinter to call function callback with arguments args after a delay of at least delay_ms milliseconds. There is no upper limit to how long it will actually take, but your callback won't be called sooner than you request, and it will be called only once.

    This method returns an integer “after identifier” that can be passed to the .after_cancel() method if you want to cancel the callback.

    If you do not pass a callback argument, this method waits delay_ms milliseconds, as in the .sleep() function of the standard Python time module.
    C'est beau une documentation, vous ne trouvez pas ?

    Profitez-en pour découvrir Tkinter autrement :

    https://github.com/tarball69/tkRAD/wiki/Accueil

    @+. tarball69.
    Dernière modification par Invité ; 01/03/2014 à 16h08. Motif: complément d'info

  7. #7
    Membre à l'essai
    Homme Profil pro
    L1 MI
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : L1 MI

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    Je me sens bête, merci à vous deux !

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

Discussions similaires

  1. Récupérer la ligne en cours ou la ligne qui apelle une fonction.
    Par Dominique49 dans le forum Général Java
    Réponses: 1
    Dernier message: 27/05/2011, 12h27
  2. apeller une fonction virtuelle depuis le desrtucteur
    Par contremaitre dans le forum Langage
    Réponses: 12
    Dernier message: 01/04/2010, 11h13
  3. Connaitre l'object qui apelle une fonction
    Par Nico128 dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 23/10/2008, 23h08
  4. [AJAX] Choisir l'emplacement d'une fenêtre quand elle apparait
    Par joss91 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 09/01/2008, 09h26
  5. Comment fermer une fenêtre quand la souris et clavier sont inactifs ?
    Par Goldenkiller dans le forum Composants VCL
    Réponses: 7
    Dernier message: 06/12/2004, 22h09

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