TKinter. Обновление переменной, взятой из csv каждые 10 секунд

#python #python-3.x #pandas #tkinter

#python #python-3.x #панды #tkinter

Вопрос:

Добрый вечер. У меня есть файл csv, который обновляется каждые 10 секунд. Я хочу отображать строковое значение из него в графическом интерфейсе и обновлять его как метку каждые 10 секунд (без нажатия кнопки).

Я пробовал несколько вариантов использования root.update_idletasks() , root.after но, time.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)
 

Пожалуйста, дайте мне знать, как отобразить строковое значение из csv в графическом интерфейсе и обновлять его в виде метки каждые 10 секунд.

Ответ №1:

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() , вам нужно будет передать фрейм функции запуска цикла, чтобы сделать это.

Комментарии:

1. Предоставленный вами код выполняет свою функцию — он считывает данные из csv каждые 10 секунд, обновляет метку новым значением каждые 10 секунд. Большое вам спасибо.

2. Что касается второй части вашего ответа — удаление информации о метке из функции. Это могло бы сработать, однако я не смог сделать это должным образом — либо появился пустой экран, либо проблема с переменными. Если у вас есть возможность, вы могли бы опубликовать его ниже в качестве отдельного ответа, это было бы отличной ссылкой для будущих пользователей. Спасибо еще раз!

3. Это также не изменяет значение day каждые 10 секунд.