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

wxPython Discussion :

Rafraichir un label toute les secondes


Sujet :

wxPython

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de timiti29
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 95
    Par défaut Rafraichir un label toute les secondes
    Bonjour tout le monde, j'éssais de crée un petit programme tout bête pour m'entrainer sur wxpython mais la je bloque !
    Le but de mon programme est de déclancher un compte à rebourg de 15 segondes quand on click sur un bouton, si on click sur un autre bouton on arete le compte à rebourg !
    mais j'ai un probleme, sans doute ma méthode.
    j'utilise une boucle while pour rafraichir mon label et décrémenter ma variable des segondes.
    Mais une foit lancer imposible de clicker sur mon bouton pour arreter !
    voila mon code :
    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import wx
    import time
    class apPrincipale(wx.Frame):
    	def __init__(self, titre):
    		wx.Frame.__init__(self, None, 1, title=titre, size=(225,200))
    		self.SetMinSize((225, 200))
    		self.SetIcon(wx.Icon("bombe.ico", wx.BITMAP_TYPE_ICO))
    		self.CentreOnParent()
     
    		self.password = "1234"
    		self.compteurtime = 15
    		self.compteurtime2 = 0
    		self.auto = 0
    		#Code a desindenter a la fin du programme
    		#while self.auto != 1:
    		#	dlg = wx.TextEntryDialog(self, 'Entrez le mot de passe pour activer la bombe :','Erreur, mot de passe requis !')
    		#	if dlg.ShowModal() == wx.ID_OK:
    		#		if dlg.GetValue() == self.password:
    		#			dlg.Destroy()
    		#			self.auto = 1
    		#	else:
    		#		self.auto = 1
    		#		dlg.Destroy()
    		#		self.Destroy()
    		self.conteneur = wx.Panel(self, 1, size=self.GetClientSize())
    		self.timetext = wx.StaticText(self.conteneur, -1, "", (50, 5), style=wx.ALIGN_CENTRE)
    		self.Exit = wx.Button(self.conteneur, 2, 'Exit', (10, 20))
    		self.Amorce = wx.Button(self.conteneur, 3, 'Amorcer la bombe', (10, 45))
    		self.Desamorce = wx.Button(self.conteneur, 4, 'Desamorcer la bombe', (10, 70))
    		self.Desamorce.Disable()
    		self.Bind(wx.EVT_SIZE, self.OnSize)
    		self.Bind(wx.EVT_BUTTON, self.OnExit, id=2)
    		self.Bind(wx.EVT_BUTTON, self.OnAmorcage, id=3)
    	def OnExit(self, evt):
    		self.Destroy()
    	def OnSize(self, evt):
    		self.conteneur.SetSize(self.GetClientSize())
    	def OnAmorcage(self, evt):
    		self.compteurtime2 = self.compteurtime
    		self.Exit.Disable()
    		self.Desamorce.Enable()
    		self.Amorce.Disable()
    		while self.compteurtime2 != -1:
    			self.timetext.SetLabel(str(self.compteurtime2)+" Segondes restantes")
    			self.compteurtime2 = self.compteurtime2 -1
    			time.sleep(1)
    		self.Desamorce.Disable()
    		self.Exit.Enable()
    		self.Amorce.Enable()
    	def OnDesamorcage(self, evt):
    		print "tu vient de desamorcer une bombe tes trop fort"
    class MonApp(wx.App):
    	def OnInit(self):
    		fen = apPrincipale("Bombe")
    		fen.Show(True)
    		self.SetTopWindow(fen)
    		return True
    if __name__ == "__main__":
    	app = MonApp()
    	app.MainLoop()
    Existe t-il d'autre méthode pour faire cela ?
    Merci de vautre aide
    timiti29

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2008
    Messages : 76
    Par défaut
    Salut !

    En utilisant une boucle while pour compter le temps tu empêches la boucle principale de wx (mainloop) de s'exécuter donc de récupérer les événements du programme (par ex. cliquer sur un bouton).

    A mon sens, le plus propre serait d'utiliser un wx.Timer qui se déclencherait toutes les secondes.

  3. #3
    Membre confirmé Avatar de timiti29
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 95
    Par défaut
    Merci !!! j'avais pas pensser à sa !
    j'ai réussi à faire ce que je voulais.
    Mon code :
    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import wx
    import time
    class apPrincipale(wx.Frame):
    	def __init__(self, titre):
    		wx.Frame.__init__(self, None, 1, title=titre, size=(225,200))
    		self.SetMinSize((225, 200))
    		self.SetIcon(wx.Icon("bombe.ico", wx.BITMAP_TYPE_ICO))
    		self.CentreOnParent()
     
    		self.timer = wx.Timer(self, 2)
     
    		self.compteurtime = 15
    		#Code a desindenter a la fin du programme
    		self.password = "1234"
    		self.auto = 0
    		while self.auto != 1:
    			dlg = wx.PasswordEntryDialog(self, 'Entrez le mot de passe pour activer la bombe :','Erreur, mot de passe requis !')
    			if dlg.ShowModal() == wx.ID_OK:
    				if dlg.GetValue() == self.password:
    					dlg.Destroy()
    					self.auto = 1
    			else:
    				self.auto = 1
    				dlg.Destroy()
    				self.Destroy()
    		self.auto = 0
    		self.conteneur = wx.Panel(self, 1, size=self.GetClientSize())
     
    		self.timetext = wx.StaticText(self.conteneur, -1, "", (50, 5), style=wx.ALIGN_CENTRE)
    		self.Amorce = wx.Button(self.conteneur, 3, 'Amorcer la bombe', (10, 45))
    		self.Desamorce = wx.Button(self.conteneur, 4, 'Desamorcer la bombe', (10, 70))
    		self.Desamorce.Disable()
    		self.Exit = wx.Button(self.conteneur, 5, 'Exit', (10, 20))
     
    		self.Bind(wx.EVT_BUTTON, self.OnExit, id=5)
    		self.Bind(wx.EVT_SIZE, self.OnSize)
    		self.Bind(wx.EVT_BUTTON, self.OnAmorcage, id=3)
    		self.Bind(wx.EVT_BUTTON, self.OnDesamorcage, id=4)
    		self.Bind(wx.EVT_TIMER, self.OnTimer, id=2)
    		self.Bind(wx.EVT_CLOSE, self.OnClose)
    	def OnExit(self, evt):
    		if self.compteurtime == 0 or not self.timer.IsRunning():
    			self.Destroy()
    		else:
    			dlg4 = wx.MessageDialog(None, "Erreur : Il faut désamorçer la bombe avant de pouvoir quitter !".decode('utf8'), "Erreur", wx.OK|wx.ICON_ERROR)
    			retCode = dlg4.ShowModal()
    			if retCode == wx.ID_OK:
    				dlg4.Destroy
    	def OnSize(self, evt):
    		self.conteneur.SetSize(self.GetClientSize())
    	def OnAmorcage(self, evt):
    		if self.compteurtime <= 0:
    			return
    		self.timer.Start(1000)
    		self.timetext.SetLabel(str(self.compteurtime)+" segondes")
    		self.Exit.Disable()
    		self.Amorce.Disable()
    		self.Desamorce.Enable()
    	def OnDesamorcage(self, evt):
    		while self.auto != 1:
    			dlg3 = wx.PasswordEntryDialog(self, 'Entrez le mot de passe pour desactiver la bombe :','Erreur, mot de passe requis !')
    			if dlg3.ShowModal() == wx.ID_OK:
    				if dlg3.GetValue() == self.password:
    					dlg3.Destroy()
    					self.auto = 1
    					if self.compteurtime == 0 or self.compteurtime <= 0 or not self.timer.IsRunning():
    						return
    					self.timer.Stop()
    					self.timetext.SetLabel(str(self.compteurtime)+" segondes")
    					wx.Bell()
    					self.Exit.Enable()
    					self.Amorce.Enable()
    					self.Desamorce.Disable()
    			else:
    				self.auto = 1
    				dlg3.Destroy()
    		self.auto = 0
    	def OnTimer(self, event):
    		self.compteurtime = self.compteurtime -1
    		self.timetext.SetLabel(str(self.compteurtime)+" segondes")
    		if self.compteurtime == 0:
    			self.timer.Stop()
    			self.timetext.SetLabel('Boum !!!')
    			dlg2 = wx.MessageDialog(None, "Boum !", "Boum !", wx.OK|wx.ICON_ERROR)
    			retCode = dlg2.ShowModal()
    			if retCode == wx.ID_OK:
    				dlg2.Destroy
    			self.Exit.Enable()
    			self.Amorce.Enable()
    			self.Desamorce.Disable()
    	def OnClose(self, evt):
    		if self.compteurtime == 0 or not self.timer.IsRunning():
    			self.Destroy()
    		else:
    			dlg4 = wx.MessageDialog(None, "Erreur : Il faut désamorçer la bombe avant de pouvoir quitter !".decode('utf8'), "Erreur", wx.OK|wx.ICON_ERROR)
    			retCode = dlg4.ShowModal()
    			if retCode == wx.ID_OK:
    				dlg4.Destroy
    class MonApp(wx.App):
    	def OnInit(self):
    		fen = apPrincipale("Bombe")
    		fen.Show(True)
    		self.SetTopWindow(fen)
    		return True
    if __name__ == "__main__":
    	app = MonApp()
    	app.MainLoop()

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

Discussions similaires

  1. rafraichir un datagridview toute les x secondes
    Par opadm dans le forum Windows Forms
    Réponses: 13
    Dernier message: 21/12/2011, 22h27
  2. [AJAX] Rafraichir une partie de la page toutes les secondes
    Par identifiant_bidon dans le forum AJAX
    Réponses: 13
    Dernier message: 20/03/2011, 08h18
  3. definition d'une tache qui s'execute toutes les secondes
    Par Mokhtar BEN MESSAOUD dans le forum Administration système
    Réponses: 3
    Dernier message: 07/08/2007, 07h19
  4. Réponses: 2
    Dernier message: 20/04/2007, 12h48
  5. changer la couleur de mon Form1 toutes les secondes
    Par stacker_junior dans le forum C++Builder
    Réponses: 9
    Dernier message: 10/05/2006, 19h36

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