【问题标题】:tkinter, csv file, auto updatetkinter,csv 文件,自动更新
【发布时间】:2022-10-07 00:01:40
【问题描述】:

我需要帮助,我想在不关闭窗口的情况下立即反映 csv 文件的更改。换句话说,每次有人在 csv 文件中添加或更改某些内容时,我都希望对窗口进行实时更新。

import csv

root=Tk()
root.geometry(\'500x500\')
with open(\'FILE.csv\') as file:
    reader = csv.reader(file)
    for row in reader:
        
        label= Label(root, text=row)
        label.pack()
root.mainloop()
  • 然后您需要使用root.after 定期请求回调(例如每秒一次)。该回调可以检查文件日期/时间是否已更改,如果是,则读取内容并使用label.configure 更新内容。

标签: python csv tkinter


【解决方案1】:

首先编写一个除了刷新屏幕什么都不做的函数。然后,编写另一个函数来检查文件是否已更改,如果已更改,则调用刷新函数。最后,安排定期调用该函数。

为了更容易删除旧数据,请将标签放在专用框架中。然后,您可以轻松地遍历所有子项以删除旧数据。

在以下示例中,数据将出现在csv_frame 中。刷新框架的函数名为refresh,它取要读取的文件名。函数auto_refresh 还获取文件名,以及上次调用refresh 时的mtime(修改时间)。它将检查当前 mtime 是否已更改,如果已更改,则调用 refresh。然后它安排自己在一秒钟内再次运行。将初始 mtime 设置为 -1 会强制 auto_refresh 第一次调用 refresh

import tkinter as tk
import os.path
import csv

def refresh(filename):

    for child in csv_frame.winfo_children():
        child.destroy()

    with open(filename) as csvfile:
        reader = csv.reader(csvfile)
        for row in reader:
            label = tk.Label(csv_frame, text=", ".join(row))
            label.pack(side="top", anchor="w")

def auto_refresh(filename, last_mtime=-1):
    mtime = os.path.getmtime(filename)
    if mtime > last_mtime:
        refresh(filename)
    root.after(1000, auto_refresh, filename, mtime)

root = tk.Tk()
csv_frame = tk.Frame(root)
csv_frame.pack(side="top", fill="both", expand=True)

auto_refresh("/tmp/FILE.csv")

root.mainloop()

【讨论】:

  • 您无需查看last_mtime is None
  • @acw1668:感谢您了解这一点。这是早期实现的保留。
  • @BryanOakley,谢谢你,我试过了,它正在工作。你建议我使用线程吗?我在主窗口上有一些小部件。
  • @acw1668 谢谢!
  • @RM2020:如果它有效,你为什么认为你需要使用线程?
猜你喜欢
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 2015-07-10
相关资源
最近更新 更多