2 votes

Comment puis-je mettre à jour le contenu du textctrl dans l'interface graphique ?

J'essaie d'écrire mon premier programme GUI en wxpython, dans mon programme, je veux obtenir le titre d'une autre fenêtre du logiciel, si le titre change, effacer l'ancien titre et montrer le nouveau titre dans le GUI, j'ai testé dans cmd, il peut obtenir le titre dans une boucle, mais je ne sais pas comment définir un événement dans le GUI pour mettre à jour le titre.

mon code :

def getinfos():
    tempWindowName=win32gui.GetWindowText (find_window())
    while True:
        titles=[]
        if (tempWindowName==win32gui.GetWindowText (find_window())):
            pass
        else:
            tempWindowName=win32gui.GetWindowText (find_window())               
            titles.append(tempWindowName)

            return title[0]

    time.sleep(1000)  

et le code de l'interface graphique :

import controller2
import time

########################################################################
class InfoPanel(wx.Panel):

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        try:
            self.titleResults = controller2.getinfos()                            
        except:               
            self.titleResults = 'no data'

        mainSizer = wx.BoxSizer(wx.VERTICAL)

        self.titlecontent = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE|wx.TE_RICH|wx.TE_LEFT|wx.TE_WORDWRAP|wx.NO_BORDER)                                                                                                                    
        self.titlecontent.SetBackgroundColour('white')
        self.settitle()

        mainSizer.Add(self.yejicontent, 2.5, wx.ALL|wx.EXPAND, 5)

        self.SetSizer(mainSizer)

    #----------------------------------------------------------------------
    def settitle(self):

        self.titlecontent.SetValue("%s"%self.titleResults)

########################################################################
class InfoFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="title",size=(500, 880))
        panel = InfoPanel(self)
        style= self.GetWindowStyle()
        self.SetWindowStyle(style|wx.STAY_ON_TOP)

class MyApp(wx.App):
    def OnInit(self):
        self.infoFrame=InfoFrame()        
        self.SetTopWindow(self.infoFrame)
        self.infoFrame.Show(True)        
        return True

#----------------------------------------------------------------------
if __name__ == "__main__":
    app = MyApp(False)
    app.MainLoop()

Merci pour votre temps et pour tout conseil.

1voto

Mike Driscoll Points 18662

Mettez la fonction/méthode getinfos dans un thread. Lorsque le titre change, demandez au thread d'utiliser wx.CallAfter ou wx.PostEvent (qui sont tous deux sûrs pour les threads) pour indiquer à l'interface graphique de se mettre à jour. Si vous ne le mettez pas dans un thread, votre interface graphique sera très peu réactive.

Pubsub est génial, mais ne fonctionnera pas dans ce cas si vous exécutez la fonction getinfos dans votre boucle principale wxPython, car elle la bloquera. Vous pouvez utiliser pubsub dans le thread en combinaison avec les méthodes threadsafe que j'ai mentionnées.

0voto

GP89 Points 2024

Vous pouvez envoyer un événement wx personnalisé ou la mise en place pubsub .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X