2010-06-07 144 views
1

我想做一个简单的程序,不断显示和更新显示CPU使用率的标签,同时还有其他不相关的事情发生。蟒蛇线程

我已经做了足够的研究,知道线程可能会涉及到。但是,我很难将我所看到的线程的简单示例应用到我正在尝试做的事情上。

我现在有打算:

import Tkinter 
import psutil,time 

from PIL import Image, ImageTk 

class simpleapp_tk(Tkinter.Tk): 
    def __init__(self,parent): 
     Tkinter.Tk.__init__(self,parent) 
     self.parent = parent 
     self.initialize() 

    def initialize(self): 

     self.labelVariable = Tkinter.StringVar() 
     self.label = Tkinter.Label(self,textvariable=self.labelVariable) 
     self.label.pack() 

     self.button = Tkinter.Button(self,text='button',command=self.A) 
     self.button.pack() 

    def A (self): 
     G = str(round(psutil.cpu_percent(), 1)) + '%' 
     print G 

     self.labelVariable.set(G) 

    def B (self): 
     print "hello" 


if __name__ == "__main__": 
    app = simpleapp_tk(None) 
    app.mainloop() 

在上面的代码基本上,我试图让命令这是一个持续运行,同时允许当用户按下按钮来完成指令B。

+0

对于这种简单的事情,你绝对不需要穿线;这只会使解决方案变得复杂。 – 2010-06-08 13:54:52

回答

4

您不应该尝试从不是主线程的线程更改UI元素。

你可能想要的是after(delay_ms, callback, args)。有些信息可以在http://www.pythonware.com/library/tkinter/introduction/x9507-alarm-handlers-and-other.htm以上。

作为示例,下面是一个显示时钟的快速脚本(注:我从来没有真正使用过Tk)。

from Tkinter import * 
from time import strftime 

class App(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.label_var = StringVar() 
     self.label = Label(self, textvariable=self.label_var) 
     self.label.pack() 
     # Start the loop 
     self.go() 

    def go(self): 
     self.label_var.set(strftime("%H:%M:%S")) 
     # The callback is only called once, so call it every time 
     self.after(1000, self.go) 

app = App() 
mainloop() 
2

对于这样一个简单的任务,您不需要线程。您可以简单地安排您的任务每秒运行一次,这可以使用'after'方法完成;

首先,这种方法添加到您的simpleapp_tk类:

def update(self): 
    G = str(round(psutil.cpu_percent(), 1)) + '%' 
    self.labelVariable.set(G) 
    self.after(1000, self.update) 

然后,在你的初始化方法中添加此调用:

self.update() 

这将导致标签更新为当前的CPU值。然后更新方法将重新安排自己在一秒钟内重新运行。