我自学自己一些Python OOP,我创建了一个简单的GUI,使用Popen在后台启动一些脚本。我需要始终确定这些脚本是否处于活动状态,我将使用循环。编写GUI时,是否有可能始终在后台运行循环?
但是我怎样才能让循环在任何时候都在后台运行,而不会中断用户使用GUI的能力?
我自学自己一些Python OOP,我创建了一个简单的GUI,使用Popen在后台启动一些脚本。我需要始终确定这些脚本是否处于活动状态,我将使用循环。编写GUI时,是否有可能始终在后台运行循环?
但是我怎样才能让循环在任何时候都在后台运行,而不会中断用户使用GUI的能力?
您必须在后台运行线程。线程只是一组与其他线程同时运行的代码。例如一个python程序就是一个线程,每次只能有一个动作发生,这就是为什么你会看到一个带有无限循环和gui的滞后。如果你创建一个新的线程,虽然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/
祝你好运
请注意python不支持多执行线程。当python运行时,只有1个线程在任何给定的时间运行。但是,您仍然必须确保数据的安全性不受多次访问的影响(例如,一个线程开始执行某些操作,正在进行interupting,另一个线程执行并开始执行其他操作,然后发生闹闹)
在一个你不应该(而probalby不会,因为它往往会导致崩溃)从不止一个线程操纵你的小部件。大多数图形用户界面提供了一种将“任务”发布到正在运行GUI的线程的方式)这可能很乏味,但它是它工作的唯一方式。例如:wxPython提供了一个wx.CallAfter函数。
尽可能多地尝试在您的构造函数中分配locks(以防止线程同时触及共享数据)和condition objects(用于发信号给一个线程继续处理来自另一个线程的内容) (S)之前杀青你的线程:
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)
对不起,这可能是一个愚蠢的问题,但为什么你能不能只用一个子进程打开在b中运行一个循环ackground。我试过了,但是它只是开始循环,并且从不启动我的GUI。 – CobraBytez 2011-05-18 19:13:34
我不得不看你如何启动Popen,以及你如何处理来自它的数据。 – Andrew 2011-05-18 19:18:21
如果您想要一个线程安全的GUI,您可以使用http://code.activestate.com/recipes/577633(第77-254行)中的代码。该代码需要在Python 3.x中导入'_thread,队列,运算符,tkinter.filedialog,tkinter.messagebox,tkinter.ttk'。该代码很容易扩展,给出了代码底部列出的封装小部件的示例。您可以查看完整的配方以获取完整的使用示例。 – 2011-05-18 19:33:34