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 :

Bouton "Refresh", actualiser TextCtrl


Sujet :

wxPython

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Bouton "Refresh", actualiser TextCtrl
    Bonjour,

    Voila je viens vers vous car j'ai un souci que je n'arrive pas à résoudre.

    J'ai un toolbook, et donc sur chaque page, un panel associé.

    Sur un des panels, j'ai plusieurs TextCtrl contenant une liste chacun.
    Du texte s'ajoute régulièrement dans ces listes, et je suis donc obligé de relancer l'appli pour voir les changements.

    J'essaie désespérément de faire un bouton Refresh pour actualiser le tout.

    Jusqu'ici, j'y arrive plutôt pas mal en détruisant mon panel pour le reconstruire.
    Je suis par contre obligé de recadrer manuellement mon appli pour que l'affichage soit actualisé.
    J'arrive ensuite à faire un self.SendSizeEvent(), et là plus de problème, ça détruit le panel, le reconstruit, et me l'actualise tout seul.

    Maintenant, ce que je n'arrive pas à expliquer, c'est que si je refais une deuxième fois un SendSizeEvent(),ça ne fait plus du tout la même chose, il me détruit mon panel et me le reconstruit en arrière plan ou je ne sais où ...

    J'ai essayé avec self.Refresh(), self.Update(), self.Layout(), je n'arrive à rien.
    Peut-être que je me suis planté de direction avec la destruction de mon panel, je ne sais pas s'il y a un autre moyen de rafraichir la bête.

    Merci

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

    peux-tu poster un code minimal qui reproduise ton erreur? merci
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    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
    import wx
    class mainframe(wx.Frame):
        def __init__(self, *args, **kwds):
            kwds["style"] = wx.DEFAULT_FRAME_STYLE
            wx.Frame.__init__(self, *args, **kwds)
            self.toolbook_1 = wx.Toolbook(self, -1, style=wx.BK_TOP)
            self.Maximize()
            self.Centre()
     
     
            self.liste_1 = ['1', '2', '3']
            self.makepanel1()
     
            self.panel2 = wx.Panel(self.toolbook_1, -1, style=wx.RAISED_BORDER)
            self.titre2 = wx.StaticBox(self.panel2, label=u"panel2")
            self.sizer_2 = wx.StaticBoxSizer(self.titre2, wx.HORIZONTAL)
            self.panel2.SetSizer(self.sizer_2)
            self.sizer_2.Fit(self.panel1)   
     
     
            il = wx.ImageList(64, 64)
            index2 = il.Add(wx.Image("1.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap())
            index1 = il.Add(wx.Image("1.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap())
     
            self.toolbook_1.AssignImageList(il)
     
            self.toolbook_1.AddPage(self.panel1, "1", imageId=index2)
            self.toolbook_1.AddPage(self.panel2, "2", imageId=index1)
     
            self.ProcessEvent(wx.SizeEvent((-1,-1))) 
            self.Layout()
        def makepanel1(self):
            liste_str = "".join(self.liste_1)
            self.panel1 = wx.Panel(self.toolbook_1, -1, style=wx.RAISED_BORDER)
     
            self.titre1 = wx.StaticBox(self.panel1, label=u"panel1")
            self.sizer_1 = wx.StaticBoxSizer(self.titre1, wx.HORIZONTAL)
            self.tc1 = wx.TextCtrl(self.panel1, -1, liste_str, pos=wx.DefaultPosition, size=wx.DefaultSize)
     
            bouton_add = wx.Button(self.panel1, -1, "APPEND LISTE", pos=(50,50))
            bouton_refresh = wx.Button(self.panel1, -1, "REFRESH TEXTCTRL", pos=(100,100))
     
     
     
            bouton_add.Bind(wx.EVT_BUTTON, self.AppendListe, bouton_add)
            bouton_refresh.Bind(wx.EVT_BUTTON, self.RefreshListe, bouton_refresh)
     
            self.sizer_1.Add(self.tc1)
     
            self.panel1.SetSizer(self.sizer_1)
            self.sizer_1.Fit(self.panel1)    
        def AppendListe(self, event):
            self.liste_1.append("pwet")
            print self.liste_1
        def RefreshListe(self, event):
            # u = self.panel1.GetSize()
            self.panel1.Destroy()
     
            self.makepanel1()
            self.SendSizeEvent()
     
     
     
     
     
    if __name__ == "__main__":
        app = wx.PySimpleApp(0)
        wx.InitAllImageHandlers()
        frame_2 = mainframe(None, -1, "")
        app.SetTopWindow(frame_2)
        frame_2.Show()
        app.MainLoop()
    Voilà, reste juste à mettre un 1.png de 64*64 dans le même répertoire que le script, ça devrait tourner je pense ?

    Donc sur ce bout de code, j'ajoute avec le bouton APPEND le mot pwet à ma liste, et si je rafraichis une premiere fois, ça fonctionne. Si je rafraichis une seconde, ça me fait un petit micmac oO.

    Si je change de panel pour revenir au panel1, ça rafraichit bien.

    Merci pour ta réponse

  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 : 44
    Localisation : France

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

    ton TextCtrl est initialisé avec la valeur de la liste mais il faut le mettre à jour à chaque ajout:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        def AppendListe(self, event):
            self.liste_1.append("pwet")
            print self.liste_1
            self.tc1.SetValue(''.join(self.liste1))
            event.Skip()
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Salut, merci de ta réponse, désolé du retard (grand weekend oblige )

    Ca ne me paraît pas approprié à mon code, car mon textctrl fait partie d'une fonction que j'appelle, et il ne porte pas de nom lui même, (donc je ne saurais pas comment faire un tc.Set, ou même un tc.Quoiquecesoit ....

    A la limite, il faudrait déjà que je corrige ça, comment nommer une variable lorsqu'elle se trouve dans une fonction ?
    Si je veux créer plusieurs textctrl et pouvoir jouer avec, et que dans ma fonction je fais tc = wx.TextCtrl(...), la variable tc sera mon dernier TextCtrl créé avec ma fonction ... Il y a quelque chose que j'ai loupé ?

  6. #6
    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
    Bonjour,

    Pourtant, Pacificator t'a donné la bonne solution : Il te faudra avoir un accès à tes TextCtrl si tu veux les mettre à jour.

    Je ne suis pas expert mais selon moi, l'important est d'avoir "l'adresse" de ton contrôle. Cette adresse mémoire est en général assimilée à un nom de variable. Ex : "monControle1". Ce qui est plus simple à retenir plutôt que l'adresse "0x23645654". D'ailleurs, tu peux consulter cette adresse si tu tapes dans le shell "print monControle1"...

    Mais ce nom n'est pas obligatoire. C'est l'adresse.

    Tu vas donc pouvoir, par exemple, stocker cette adresse dans un dictionnaire en faisant cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dictControles = {}
    for numControle in (1, 2, 3) :
       c = wx.TextCtrl(self, -1, u"")
       dictControles[numControle] = c
    Tu constates dans ce petit exemple que l'adresse est stockée dans la variable "c" puis mémorisée dans un dictionnaire.

    Quand tu voudras envoyer un texte au contrôle numéro 2 par exemple, il te suffira d'utiliser le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    c = dictControles[2]
    c.SetValue(monTexte)
    Et voilà. J'espère avoir été clair... Ce n'est qu'une solution parmi tant d'autres. Mais c'est peut-être la plus simple dans ta situation.

    A +

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