如何使用函数或相邻文件中的信息更新GUI?

2024-04-19 02:20:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个传感器面板,每隔一两秒钟更新一次,从开放硬件监视器中提取信息。我创建了一个函数,它输出与所需信息相关的值列表,但是我无法让它更新GUI。这是一个仅显示CPU包温度的简化版本。它将在运行时显示初始值,但不会更新。我计划用这段代码创建一个可执行文件,可以在第三屏幕上运行,从而在我的计算机上提供恒定的统计数据

import tkinter as tk
import wmi as w

root = tk.Tk()
i=0
def initialize():

    def update():
        w1 = w.WMI(namespace="root\OpenHardwareMonitor")
        temperature_infos = w1.Sensor()
        names = ['CPU Package' , 'GPU Core', 'CPU Total']
        values = [0.0 , 0.0, 0.0, 0.0, 0.0,0.0,0.0,0.0,0.0]
        for sensor in temperature_infos:
            if sensor.SensorType == u'Temperature':
                if sensor.Name == names[0]:
                    values[0] = sensor.Value
                elif sensor.Name == names[1]:
                    values[1] = sensor.Value
                else:
                    pass
            elif sensor.SensorType == u'Load':
                if sensor.Name == names[2]:
                    values[2] = sensor.Value
                elif sensor.Name == names[1]:
                    values[3] = sensor.Value
                elif sensor.Name == u'GPU Memory':
                    values[4] = sensor.Value
                elif sensor.Name == u'Memory':
                    values[5] = sensor.Value
                else:
                    pass
            elif sensor.SensorType == u'Clock':
                if sensor.Name == u'CPU Core #8':
                    values[6] = sensor.Value
                else:
                    pass
            elif sensor.SensorType == u'Fan':
                if sensor.Name == u'Fan #5':
                    values[7] = sensor.Value
                elif sensor.Name == u'GPU Fan':
                    values[8] = sensor.Value
                else:
                    pass
        return values
    values = update()
    text = tk.StringVar()
    text.set(values[0])
    label1 = tk.Label(root, textvariable = text)
    global i
    if i == 0:
         label1.pack()
         i+=1
    else:
        label1.config(textvariable = text)
   
    root.after(1000,initialize)


root.after(1000,initialize)
root.mainloop()

Tags: textnameifnamesvaluepassrootcpu
1条回答
网友
1楼 · 发布于 2024-04-19 02:20:10

我不使用Windows,所以我不能使用模块wmi,但对我来说,它应该是:

我只在开始时创建一次空的Label,并使用after(1000, update)运行函数,该函数从get_values()获取值,它使用label.config(text=...)更新标签上的文本。它不创建新的Label,它不必检查它是否需要packconfig。它不需要StringVar(但坦率地说,我可以使用它,然后我就不需要label.config

import tkinter as tk
import wmi as w

#  - functions   

def get_values():
    w1 = w.WMI(namespace="root\OpenHardwareMonitor")
    temperature_infos = w1.Sensor()
    names = ['CPU Package' , 'GPU Core', 'CPU Total']
    values = [0.0 , 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

    for sensor in temperature_infos:
        if sensor.SensorType == u'Temperature':
            if sensor.Name == names[0]:
                values[0] = sensor.Value
            elif sensor.Name == names[1]:
                values[1] = sensor.Value
            #else:
            #    pass
        elif sensor.SensorType == u'Load':
            if sensor.Name == names[2]:
                values[2] = sensor.Value
            elif sensor.Name == names[1]:
                values[3] = sensor.Value
            elif sensor.Name == u'GPU Memory':
                values[4] = sensor.Value
            elif sensor.Name == u'Memory':
                values[5] = sensor.Value
            #else:
            #    pass
        elif sensor.SensorType == u'Clock':
            if sensor.Name == u'CPU Core #8':
                values[6] = sensor.Value
            #else:
            #    pass
        elif sensor.SensorType == u'Fan':
            if sensor.Name == u'Fan #5':
                values[7] = sensor.Value
            elif sensor.Name == u'GPU Fan':
                values[8] = sensor.Value
            #else:
            #    pass

    return values

def update():
    values = get_values()
    label.config(text=values[0])
    root.after(1000, update)

#  - main  -

root = tk.Tk()

label = tk.Label(root)
label.pack(padx=20, pady=20)

root.after(1000, update)
root.mainloop()

模拟values中的更改并且每个人都可以运行它的版本

import tkinter as tk

#  - functions   

def get_values():
    import random
    values = [0.0 , 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
    values[0] = random.randrange(0, 1000)/10 # float value 0.0 ... 100.0
    return values

def update():
    values = get_values()
    label.config(text=values[0])
    root.after(1000, update)

#  - main  -

root = tk.Tk()

label = tk.Label(root)
label.pack(padx=20, pady=20)

root.after(1000, update)
root.mainloop()

编辑:

StringVar()相同,而不是label.config(text=...)

import tkinter as tk

#  - functions   

def get_values():
    import random
    values = [0.0 , 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
    values[0] = random.randrange(0, 1000)/10
    return values

def update():
    values = get_values()
    label_var.set(values[0])
    root.after(1000, update)

#  - main  -

root = tk.Tk()

label_var = tk.StringVar()  # to keep value as string
#label_var = tk.IntVar()    # to keep value as integer
#label_var = tk.DoubleVar() # to keep value as float

label = tk.Label(root, textvariable=label_var)
label.pack(padx=20, pady=20)

root.after(1000, update)
root.mainloop()

相关问题 更多 >