2010-06-07 179 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值。然後更新方法將重新安排自己在一秒鐘內重新運行。