首页 > 解决方案 > TKinter。每 10 秒刷新一次从 csv 获取的变量

问题描述

晚上好。我有每 10 秒更新一次的 csv 文件。我想在 GUI 中显示它的字符串值,并每 10 秒将其更新为标签(无需单击按钮)。

我使用 尝试了几个选项 root.update_idletasks()root.aftertime.sleep(10)没有得到所需的结果。

我的 csv 文件如下: 2 行 1 列的简单表

我的代码如下所示。

import tkinter as tk
from tkinter import *
import pandas as pd
import time

#'while' loop is used to read from csv file each 10 seconds (however it seems that I use it unproperly)
while 1:
    
    #reading from csv file 
    df=pd.read_csv('outputs.csv') 

    #assigning string value to variable 'day'. This string value is udpated each 10 seconds inside the csv file 
    day=df.at[0, 'Date/Time']

    #creating function that updates label each 10 seconds
    def set_label():
        var = StringVar()
        var.set(day)

        label = tk.Label(frame, textvariable=var)
        label.place(relwidth=1, relheight=1)

        root.after(1000, set_label)
        root.update_idletasks()


    root  = tk.Tk()

    #creating frame 
    frame = tk.Frame(root)
    frame.place(relwidth=1, relheight=1)

    #calling function
    set_label()

    root.mainloop()
    
    #to read from csv file again in 10 seconds
    time.sleep(10)

请让我知道如何在 GUI 中显示来自 csv 的字符串值,并每 10 秒将其更新为标签。

标签: pythonpython-3.xpandastkinter

解决方案


root.after可能是最直接的方法:

from tkinter import *
import pandas as pd

# creating function that updates label each 10 seconds
def set_label(day):
    var = StringVar()
    var.set(day)

    label = Label(frame, textvariable=var)
    label.place(relwidth=1, relheight=1)

def run():
    # reading from csv file 
    df=pd.read_csv('outputs.csv') 

    # assigning string value to variable 'day'. This string value is udpated each 10 seconds inside the csv file 
    day = df.at[0, 'Date/Time']

    # calling function
    set_label(day)

    root.after(10000, run)

root = Tk()

# creating frame 
frame = tk.Frame(root)
frame.place(relwidth=1, relheight=1)

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

这只是转换。如果我没记错的话,你现在实际上不需要每次都创建一个新标签,所以代码set_label()看起来更像

def set_label(day):
    var = StringVar()
    var.set(day)

Tkinter 可能有点挑剔,如果它没有自动更新,您可以使用 调用帧更新frame.update(),您必须将帧传递给循环运行函数才能执行此操作。


推荐阅读