在编写GUI时,是否可以让一个循环一直在后台运行?

3 投票
3 回答
2958 浏览
提问于 2025-04-16 17:54

我正在自学一些Python的面向对象编程(OOP),并且我创建了一个简单的图形用户界面(GUI),可以在后台启动一些脚本。我需要随时知道这些脚本是否在运行,我本来打算用一个循环来实现这个功能。

但是,我该如何让这个循环在后台一直运行,而又不影响用户使用这个图形界面呢?

3 个回答

2

要注意,Python不支持多线程同时执行。也就是说,当Python在运行时,任何时候只有一个线程在工作。不过,你还是得确保你的数据在多个线程访问时是安全的(比如,一个线程开始做某件事,结果被打断了,另一个线程又开始做其他事情,这样就会出现问题)。

在编写图形用户界面(GUI)时,你不应该(而且通常也不会,因为这样容易导致崩溃)从多个线程去操作你的控件。大多数GUI都会提供一种方法,让你可以把“任务”发送到正在运行GUI的线程中。虽然这样做可能会有点繁琐,但这是唯一可行的方法。例如,wxPython提供了一个叫wx.CallAfter的函数。

尽量在你创建线程之前,在构造函数中分配好你的(用来防止多个线程同时访问共享数据)和条件对象(用于让一个线程通知另一个线程继续执行某些操作)。

import threading

class(object):
    def __init__(self):
        self._lock = threading.Lock()
        self._cond = threading.Condition(self._lock) # conditions are associated with locks

准备好经常看到这种结构:

 def myMethod(self):
    self._lock.acquire()
    try:    # or with if you prefer
       # do my stuff
       # pack up my data
       def myFunc():
          # post updates to widgets

    finally:
       self._lock.release()

       wx.CallAfter(myFunc)
3

如果你想让你的程序同时做多件事情,可以使用threading这个模块。要在不同的线程之间进行交流,可以使用queue这个模块。不过在开始之前,建议你先在网上搜索一下“python threading tutorial”,这样你可以更好地理解线程是怎么工作的。

5

你需要在后台运行一个线程。线程就是一段代码,它可以和其他线程同时运行。比如说,一个Python程序就是一个线程,这意味着在任何时候只能执行一个动作。这就是为什么你会看到无限循环和图形界面(gui)一起使用时会出现卡顿的原因。不过,如果你创建一个新的线程,图形界面会在一个线程中运行,而循环会在另一个线程中运行。这是理想情况下的表现。

想了解更多关于Python中的线程,可以在谷歌上搜索一下,但这里有一些链接供你参考:http://www.prasannatech.net/2008/08/introduction-to-thread-programming.html
http://www.wellho.net/solutions/python-python-threads-a-first-example.html
http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/

祝你好运!

撰写回答