2

我正在尝试编写我的第一个 wxpython GUI 程序,在我的程序中,我想获得另一个软件窗口的标题,如果标题改变,清除旧标题并在 GUI 中显示新标题,我在 cmd 中测试,它可以得到循环中的标题,但我不知道如何在 GUI 中设置事件来更新标题。

我的代码:

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)  

和图形用户界面代码:

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()

感谢您的宝贵时间,并感谢您的任何建议。

4

2 回答 2

1

将 getinfos 函数/方法放入线程中。当标题更改时,让线程使用 wx.CallAfter 或 wx.PostEvent(两者都是线程安全的)来告诉 GUI 更新。如果你不把它放到一个线程中,你的 GUI 将非常迟钝。

Pubsub 很不错,但在这种情况下,如果您在 wxPython 主循环中运行 getinfos 函数,它将无法正常工作,因为它会阻塞它。您可以在线程中结合我提到的那些线程安全方法使用 pubsub。

于 2012-06-22T13:44:02.387 回答
0

您可以发送自定义 wx 事件或设置pubsub

于 2012-06-22T09:02:43.857 回答