在执行python函数时更新GUI,同时保持此函数guiindependent

2024-09-29 22:35:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python函数,它接受一些参数并执行一些任务(我们称之为theFunc)。当func运行时,内部变量resultingMessage得到越来越多的行,我在执行结束时将其显示在GUI上。理想情况下,我希望resultingMessage在GUI上显示和更新,而不是在func执行完成之后,并且在不污染func的情况下(这已经足够复杂了)。最好的办法是什么?在

我可以想到两种可能的方法(两种方法都很遥远):

  1. 有两个线程:一个执行theFunc并在一个变量/文件中写入resultingMessage,另一个检查这个变量/文件并更新GUI
  2. 不要向resultingMessage追加行,而是将一些“stream”附加到GUI元素;向“stream”添加行将更新GUI。在

我想应该有一个传统的方法来做。在

环境:cpython2.7、Win XP、WXPython


Tags: 文件方法函数元素stream参数情况gui
2条回答

你应该使用线程。wxPython提供了几个线程安全的方法,例如wx.CallAfter公司, wx.CallLater公司以及wx.事件后. 你也可以把它们和pubsub结合起来发送消息!在你的例子中,我认为通过wx方法wx.CallAfter公司无论你想显示什么文本都可以。在

mikedriscoll的回答描述了最常用的方法。他在自己的网站上有一篇非常好的文章,详细介绍了here。他那里有很多很好的文章,看看吧。在

另一种方法是在主线程中设置一个计时器,用于检查队列中的消息。在init方法中设置队列,并将其传递给运行长时间运行函数的工作线程。worker根据需要将内容放入队列,与timer事件相关联的函数将在主线程中拾取消息/数据并更新GUI等。下面是一个简短的示例:

#first 4 lines are the bottom of the __init__ method of the main frame
    self.timer = wx.Timer(self)
    self.timer.Start(250)
    self.Bind(wx.EVT_TIMER, self.onTimer, self.timer)
    self.Bind(wx.EVT_CLOSE, self.onClose)

def onTimer(self, event):
    '''checks for messages in self.q2 (Queue.Queue set up above)'''
    while not self.q2.empty():
        msg, data = self.q2.get()
        self.update(None, msg, data)

def update(self, event, msg, data):
    '''Runs with data returned in self.q2'''
    self.sb.SetStatusText(msg)
    etc, etc . . .

祝你好运,迈克

相关问题 更多 >

    热门问题