Python 线程处理

1 投票
2 回答
703 浏览
提问于 2025-04-15 23:38

我正在尝试制作一个简单的程序,这个程序会不断显示和更新一个标签,标签上显示的是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()

撰写回答