Python Threading - PullRequest
       12

Python Threading

1 голос
/ 07 июня 2010

Я пытаюсь сделать простую программу, которая постоянно отображает и обновляет метку, которая отображает загрузку процессора, в то время как происходят другие не связанные вещи.

Я провел достаточно исследований, чтобы понять, что, вероятно, будет задействована многопоточность. Однако у меня возникают проблемы с применением того, что я видел в простых примерах потоков, к тому, что я пытаюсь сделать.

Что у меня сейчас происходит:

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 ]

4 голосов
/ 07 июня 2010

Вы никогда не должны пытаться изменить элемент пользовательского интерфейса из потока, который не является основным потоком.

То, что вы, вероятно, хотите, это 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 голосов
/ 08 июня 2010

Вам не нужны темы для такой простой задачи. Вы можете просто запланировать выполнение своей задачи каждую секунду или около того, что можно сделать с помощью метода after;

Сначала добавьте этот метод в класс simpleapp_tk:

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

Затем в вашем методе initialize добавьте этот вызов:

self.update()

Это приведет к обновлению метки до текущего значения процессора. Затем метод обновления перепланирует себя для повторного запуска через одну секунду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...