2011-05-18 31 views
3

我自学自己一些Python OOP,我创建了一个简单的GUI,使用Popen在后台启动一些脚本。我需要始终确定这些脚本是否处于活动状态,我将使用循环。编写GUI时,是否有可能始终在后台运行循环?

但是我怎样才能让循环在任何时候都在后台运行,而不会中断用户使用GUI的能力?

回答

5

您必须在后台运行线程。线程只是一组与其他线程同时运行的代码。例如一个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/

祝你好运

3

要让程序一次执行多件事,请使用threading模块。对于线程之间的通信,使用queue模块。但首先谷歌“蟒蛇线程教程”,所以你可以了解线程如何工作。

2

请注意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) 
+1

对不起,这可能是一个愚蠢的问题,但为什么你能不能只用一个子进程打开在b中运行一个循环ackground。我试过了,但是它只是开始循环,并且从不启动我的GUI。 – CobraBytez 2011-05-18 19:13:34

+1

我不得不看你如何启动Popen,以及你如何处理来自它的数据。 – Andrew 2011-05-18 19:18:21

+0

如果您想要一个线程安全的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

相关问题