用TKinter如何实现实时数据更新功能?

问题描述

目前我用Tkinter库做了一个GUI界面,主要功能是读取远程服务器的数据,然后显示在GUI界面上,间隔20或30秒读取一次远程数据,我采用多线程的方式来实现远程读取,这样GUI界面才会显示正常,不过这个多线程代码部分有问题。

问题出现的环境背景及自己尝试过哪些方法

图片描述
这是我做的主界面,正常是点击“开始监控”按钮以后20-30秒以后界面的各项显示对应的数值。

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

定义提取远程服务器数据的方法,SYSINFO.doAll()这个类函数是之前定义的提取远程服务器各项数据的,因为代码量有一些大,我就不贴在上面了,但是提取完远程服务器数据以后,会保存在testdata这个列表中

def ReceiveData():

global testdata
testdata = SYSINFO.doAll()

定义多线程的一个方法

def fun_timer():

global timer,testdata
testdata = SYSINFO.doAll()
timer = threading.Timer(20, fun_timer)
timer.start()

定义开关按钮的状态全局变量

Button_Status = "OFF"

定义“开始监控”按钮的方法

def Start_Monitor():

global Button_Status
if Button_Status == "OFF":
    Button_Status = "ON"
    timer = threading.Timer(1, fun_timer)
    timer.start()
    mserver_window.update_idletasks()

定义“关闭监控”

def Close_Monitor():

global Button_Status
Button_Status = "OFF"

你期待的结果是什么?实际看到的错误信息又是什么?

目前运行这段代码以后,在多线程部分存在一些问题,好像是线程的逻辑有问题或者是如何让线程停止的条件有问题,运行以后即使testdata列表中有数据,GUI界面的这些“空”也不变化,mserver_window.update_idletasks() 这个方法不对吗?还是怎么的?

阅读 17.1k
1 个回答

没看到你的界面程序是如何写的,控件要绑定一个IntVarStrVar变量,然后修改这变量即可。

python3

from tkinter import *
import threading

class 界面类(Tk):
    def __init__(self):
        super().__init__()
        self.title('试验')
        self.int_n = IntVar()
        self.thelabel = Label(self, textvariable=self.int_n, padx=10, pady=20).pack()
        self.mythread = threading.Thread(target=self.工作线程, name='线程_1')
        self.cond = threading.Condition() # 锁
        self.stop = False
        self.mythread.start()
        self.bind('<Destroy>', self.结束线程)
        
    def 工作线程(self):
        n=0
        while 1:
            with self.cond: # 锁
                n = (n+1)%100
                self.int_n.set(n) # 修改变量
                self.cond.wait(0.1) # 可以改为 20秒
                if self.stop: break  # 退出线程循环

    def 结束线程(self, event):
        with self.cond: # 锁
            self.stop = True  # 设置结束标志
            self.cond.notify()
            
if __name__ == '__main__':
    界面 = 界面类()
    界面.mainloop()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题