#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 секунд.