python - 使用 pandastable 更新表内容(Python、tkinter)

标签 python pandas tkinter

我有一个数据框使用 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/

相关文章:

python - 类型错误 : 'NoneType' object does not support item assignment?

python - 处理丢失数据时出现 IndexError : too many indices for array ,

python - 查找具有共同起始元素的子列表 - python

python - Pandas :你能访问滚动窗口项目吗

python - 如何连接 Pandas 中的年份和月份列?

python - 使用 pandas 和 bokeh 创建带有分组的堆叠条形图

python - 每当有来自串行端口 python 3.x 的新数据时,从串行数据更新 tkinter 标签

python - tkinter add_checkbutton 菜单没有获得复选标记,尽管存在变量(MacOS)

python - Flask-SocketIO eventlet 无法切换到不同的线程

python - python 动态条形图生成错误