我希望用pandas读取的数据在tkinter窗口中每1秒更新一次



我希望用panda读取的数据在tkinter窗口中每1秒更新一次。相反,显示窗口一个接一个地显示连续插入的行的数据。如何更改?

import time
import pandas as pd
from tkinter import Tk, Label
root = Tk()
df =pd.read_csv('ab.csv')
for i , row in df.iterrows():
time.sleep(1)
a = row[2],row[3],row[4]
print(a)
root.title('Generator')
root.geometry("900x200")
label = Label(root, text=a, font=30, fg="black")
# root.update_idletasks()
root.update()
label.pack()
root.mainloop()

pandas DataFrame.iterrows是一个迭代器,这意味着你可以在它的下一个版本中调用Python。你所做的是对整个数据帧进行迭代,然后开始显示内容,这显然最终会出现在迭代器最后生成的内容中。

为了在tkinter中观察迭代器,您可以使用tcl-after方法作为python tkinter内置的协程。

总之,你的代码应该看起来像:

import pandas as pd
from tkinter import Tk, Label
def animated_content():
try:
#try to get next row
_, row = next(iterator)
a = row[2],row[3],row[4]
label.configure(text=a)
except StopIteration:
#if iterator comes to an end
print('dataframe is exhausted')
else:
#try another one in 1000ms
root.after(1000, animated_content)
iterator =pd.read_csv('ab.csv').iterrows()
root = Tk()
root.title('Generator')
root.geometry("900x200")
label = Label(root, fg="black")
label.pack()
animated_content()#start animation
root.mainloop()

必须使用通用after(x, func)方法在x毫秒后重复func。您还必须使用config方法来更改现有标签的文本,而不是重新创建一个新的公开标签。

import pandas as pd
from tkinter import Tk, Label
root = Tk()
root.title('Generator')
root.geometry("900x200")
lbls = []

def repeat():
df = pd.read_csv('ab.csv')
for i, row in df.iterrows():
a = row[2], row[3], row[4]  # Safe if converted a string instead
# Get the current label from the list and update its text
lbls[i].config(text=a)
root.after(1000, repeat)  # Call repeat after 1000 ms

def read():
df = pd.read_csv('ab.csv')
for i, row in df.iterrows():
a = row[2], row[3], row[4]  # Safe if converted a string instead
print(a)
label = Label(root, text=a, font=30, fg="black")
label.pack()
# Append the labels to a list to be able to edit them later in order
lbls.append(label)
root.after(1000, repeat)

root.wait_visibility()
read()
root.mainloop()

最新更新