Python 线程处理
我正在尝试制作一个简单的程序,这个程序会不断显示和更新一个标签,标签上显示的是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()
在上面的代码中,我基本上是想让命令A持续运行,同时当用户按下按钮时,命令B也能执行。
2 个回答
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 值。更新方法会在一秒后再次安排自己运行。
4
你绝对不应该试图在不是主线程的线程中修改用户界面元素。
你可能想要的是 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()