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 sous wxpython


Sujet :

wxPython

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Rafraichir un label sous wxpython
    Bonjour,

    Je bloque sur un élément depuis plusieurs heures mais je pense que cela va vous paraître simple.

    Voila : j'ai une application graphique en wxpython et je voudrais que celle-ci fasse une requête Mysql à chaque 30 secondes
    et rafraichisse le résultat (qui est un label dans la fenêtre).

    Pour tout ce qui est Mysql pas de problème, par contre je n'arrive pas à trouver une manière fonctionnelle pour que la requête
    soit relancée à chaque 30 secondes et surtout que la fenêtre wcpython update le label à sa nouvelle valeur.

    Avec un timer j'ai réussi à relancer la requête toute les 30 secondes mais pas à rafraichir la fenêtre, je vous donne ici une exemple
    sans ce timer pour avoir un code minimal propre :

    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
    from Tkinter import *
    from threading import *
    from datetime import date, tzinfo, timedelta, datetime
    import MySQLdb
    import time
    import sys
    
    # Initialisation de la base
    conn = MySQLdb.connect('IP-DU-SERVEUR','root','MDP', 'TABLE')
    
    print "2 Debut SQL"
    
    # La requete Mysql
    curs = conn.cursor()
    requete=curs.execute("select * from exemple;" ) 
    variable=curs.fetchall()
    
    #On cree l interface
    import wx
    import wx.calendar
    
    class MyFrame(wx.Frame):
         def __init__(self, parent, title):
             wx.Frame.__init__(self, parent, -1, 'form title', wx.DefaultPosition, (250, 116),     style=wx.CLOSE_BOX | wx.SYSTEM_MENU | wx.CAPTION | wx.RESIZE_BORDER | 0 | 0 | wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX)
             self.panel = wx.Panel(self, -1)
    
             #J injecte ici la variable dans l interface
             self.Resultat = wx.StaticText(self.panel, -1, '%s' % (varirable), (144,32), (64, 21))
             self.Resultat.SetFont(wx.Font(8, wx.FONTFAMILY_DEFAULT,     wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, 'Microsoft Sans Serif'))
             self.Resultat.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT))
    
             self.label2 = wx.StaticText(self.panel, -1, 'La valeur est :', (32,32), (110, 27))
             self.label2.SetFont(wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, 'Microsoft Sans Serif'))
             self.label2.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT))
    
    
    #---------------------------------------------------------------------------
    class MyApp(wx.App):
         def OnInit(self):
             frame = MyFrame(None, 'App')
             frame.Show(True)
             self.SetTopWindow(frame)
             return True
    
    app = MyApp(True)
    app.MainLoop()
    Merci beaucoup je vais en devenir fou de ce petit truc ^^'.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 328
    Points : 240
    Points
    240
    Par défaut
    Salut,

    D'après mes souvenirs, je crois que pour rafraichir un Label tu fais : controle.SetLabel("bonjour")

    Sinon pour rafraichir toutes les 30 secondes, peut-être que tu pourrais utiliser wx.FutureCall (bon, je dis ça vite. C'est à vérifier)...

    A +

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

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Bonjour,

    voici un exemple simple utilisant les threads:
    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
    #! /usr/bin/env python
    #-*- coding: iso-8859-15 -*-
     
    import os
    import sys
    import thread
    import random
    import time
     
    try:
        import wx
    except ImportError:
        print u"""
        installer wxPython pour utiliser ce programme
        A télecharger sur www.wxpython.org"""
        sys.exit(0)
     
    import  wx.lib.newevent
     
    # ---------------------------------------------
    #creation d'evenement personnalisé
    # ---------------------------------------------
    (UpdateLabelEvent, EVT_UPDATE_LABEL) = wx.lib.newevent.NewEvent()
    # ---------------------------------------------
     
    class RandomThread(object):
     
        """
        Genere un nombre aleatoire toutes les secondes
        et poste un evenement vers la fenetre (Frame)
        passé en argument.
        """
        def __init__(self, win):
            self.win = win # la fenetre vers laquelle poster
     
        def Start(self):
            self.keepGoing = self.running = True
            thread.start_new_thread(self.Run, ())
     
        def Stop(self):
            self.keepGoing = False
     
        def IsRunning(self):
            return self.running
     
        def Run(self):
            while self.keepGoing:
                number = random.randint(1, 5000)
                evt = UpdateLabelEvent(number=str(number)) 
                wx.PostEvent(self.win, evt) 
                time.sleep(1)
            self.running = False
            return
     
     
     
    class MyFrame(wx.Frame):
     
        def __init__(self, *args, **kwargs):
     
            wx.Frame.__init__(self, *args, **kwargs)
            panel = self.panel = wx.Panel(self)
     
            self.label = wx.StaticText(panel, -1,u"", pos=(10, 10))
     
            self.Bind(EVT_UPDATE_LABEL, self.OnUpdateLabel)
            self.Bind(wx.EVT_CLOSE, self.OnClose)
     
            self.random_thread = RandomThread(self)
            self.random_thread.Start()
     
            self.SetSize((180, 50))
     
        def OnClose(self, evt):
     
            # pour arreter proprement
            busy = wx.BusyInfo(u'Arrêt en cours ... veuillez patienter')
            wx.Yield()
            self.random_thread.Stop()
            while self.random_thread.IsRunning():
                time.sleep(1)
            evt.Skip()
     
        def OnUpdateLabel(self, evt):
     
            self.label.SetLabel(evt.number)
     
    if __name__ == "__main__":
     
        app = wx.PySimpleApp(redirect=False)
        fr = MyFrame(None, -1, "exemple")
        fr.Show(True)
        app.MainLoop()
    Bon python
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci Pacificator,

    Il est super cet exemple par contre même après acharnement je ne trouve pas comment mettre 2 labels qui se rafraichissent distinctement..

    J'ai essayé de modifier le def run en mettant un evt2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        def Run(self):
            while self.keepGoing:
                     evt = UpdateLabelEvent(number=str(10)) 
                     evt2 = UpdateLabelEvent(number2=str(30)) 
                     wx.PostEvent(self.win, evt)
     
                     time.sleep(1)
            self.running = False
            return
    Puis je change pour mettre un autre label mais celui là n'est pas rafraichi :

    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
     
    class MyFrame(wx.Frame):
     
             def __init__(self, *args, **kwargs):
     
                     wx.Frame.__init__(self, *args, **kwargs)
                     panel = self.panel = wx.Panel(self)
     
                    self.label = wx.StaticText(panel, -1,u"", pos=(50, 50))
                    self.label2 = wx.StaticText(panel, -1,u"", pos=(10, 10))                       self.Bind(EVT_UPDATE_LABEL, self.OnUpdateLabel)
                    self.Bind(wx.EVT_CLOSE, self.OnClose)
     
                    self.random_thread = RandomThread(self)
                    self.random_thread.Start()
     
         def OnUpdateLabel(self, evt):
     
                     self.label.SetLabel(evt.number)
                     self.label2.SetLabel(evt2.number2)
    Comment faut-il faire j'ai vraiment cherché cela fait 1h30 que je bricole dans tous les sens ^^'.. merci !

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

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    si tes deux valeurs sont recuperées dans le même thread, il te suffit de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    evt = UpdateLabelEvent(number=str(10), color='red')
    # pour recuperer
    self.label2.SetLabel(evt.color)
    Sinon, tu dois créer deux threads, deux evenements personnalisés et deux gestionnaires d'evenements.

    @+
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

Discussions similaires

  1. Pb rafraichir un label
    Par lamoufle dans le forum Flex
    Réponses: 13
    Dernier message: 04/08/2008, 16h54
  2. Réponses: 2
    Dernier message: 12/06/2008, 16h15
  3. Rafraichir un label en fonction du travail d'une fonction
    Par blasme dans le forum Windows Forms
    Réponses: 1
    Dernier message: 06/02/2008, 12h11
  4. apparence du curseur sous wxPython
    Par acubuntu dans le forum wxPython
    Réponses: 4
    Dernier message: 30/08/2007, 09h56
  5. [JSP] rafraichir une page sous contrainte
    Par enguerran dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 07/06/2006, 03h30

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