我有一个数据框使用 pandastable 在 GUI 中显示为表格。我希望随着新数据的出现(更新数据框列)而经常更新此表。
所以我写了这个简单的例子来说明这一点:
我创建了数据帧 df,然后在程序中更新它两次,每次更新之间等待 5 秒。我希望 GUI 出现,然后内容以相同的节奏更新。相反,程序执行时仅显示表中的最终 dt 值。
我尝试使用 .update() 和 .redraw() 而不是 .show() 来更新值,但这也不起作用。
非常感谢您的意见!
import pandas as pd
import tkinter as tk
from pandastable import Table
import time
df = pd.DataFrame({
'A': [1,1,1,1,1,1,],
'B': [1,1,1,1,1,1,],
'C': [1,1,1,1,1,1,],
'D': [1,1,1,1,1,1,],
})
root = tk.Tk()
root.title('PandasTable Example')
frame = tk.Frame(root)
frame.pack(fill='both', expand=True)
pt = Table(frame, dataframe=df)
pt.show()
time.sleep(5)
df = pd.DataFrame({
'A': [2,2,2,2,2,2,],
'B': [2,2,2,2,2,2,],
'C': [2,2,2,2,2,2,],
'D': [2,2,2,2,2,2,],
})
pt.model.df = df
pt.show()
time.sleep(5)
df = pd.DataFrame({
'A': [3,3,3,3,3,3,],
'B': [3,3,3,3,3,3,],
'C': [3,3,3,3,3,3,],
'D': [3,3,3,3,3,3,],
})
pt.model.df = df
pt.show()
root.mainloop()
最佳答案
mainloop
启动 GUI - 它显示/显示窗口。 mainloop
之前的所有内容仅是 mainloop
必须显示的信息。
您可以使用root.update()
强制mainloop()
重绘窗口。
或者你可以使用root.after(milliseconds, function_name)
代替sleep
,它会在运行mainloop
后运行代码
更新 pd.model.df
后,您还可以使用 pt.readraw
代替 pt.show
- 它不会闪烁。
import pandas as pd
import tkinter as tk
from pandastable import Table
# --- function ---
def update1():
df = pd.DataFrame({
'A': [2,2,2,2,2,2,],
'B': [2,2,2,2,2,2,],
'C': [2,2,2,2,2,2,],
'D': [2,2,2,2,2,2,],
})
pt.model.df = df
#pt.show()
pt.redraw()
root.after(5000, update2)
def update2():
df = pd.DataFrame({
'A': [3,3,3,3,3,3,],
'B': [3,3,3,3,3,3,],
'C': [3,3,3,3,3,3,],
'D': [3,3,3,3,3,3,],
})
pt.model.df = df
#pt.show()
pt.redraw()
# --- main ---
df = pd.DataFrame({
'A': [1,1,1,1,1,1,],
'B': [1,1,1,1,1,1,],
'C': [1,1,1,1,1,1,],
'D': [1,1,1,1,1,1,],
})
# - gui -
root = tk.Tk()
root.title('PandasTable Example')
frame = tk.Frame(root)
frame.pack(fill='both', expand=True)
pt = Table(frame, dataframe=df)
pt.show()
root.after(5000, update1)
root.mainloop()
如果您将运行相同的代码,那么您可以使用 after
来运行相同的函数。
import pandas as pd
import tkinter as tk
from pandastable import Table
# --- function ---
def update():
pt.model.df += 1
pt.redraw()
# run again after 5000ms (5s)
root.after(5000, update)
# --- main ---
df = pd.DataFrame({
'A': [1,1,1,1,1,1,],
'B': [1,1,1,1,1,1,],
'C': [1,1,1,1,1,1,],
'D': [1,1,1,1,1,1,],
})
# - gui -
root = tk.Tk()
root.title('PandasTable Example')
frame = tk.Frame(root)
frame.pack(fill='both', expand=True)
pt = Table(frame, dataframe=df)
pt.show()
root.after(5000, update)
root.mainloop()
您可以在我的博客文章 Tkinter PandasTable Examples [GB] 中查看更多信息
关于python - 使用 pandastable 更新表内容(Python、tkinter),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68571802/