sub-window 中的小部件使用 tkinter python 中的 real-time 数据更新

widget in sub-window update with real-time data in tkinter python

我试过使用 after/time.sleep 来更新树视图,但它不适用于主循环。

我的问题是:

脚本 1:

class mainwindow(tk.Tk):
    #Initalize main window
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

       #use to shift frames
       ....
 if __name__ == "__main__":
    ...
    app = mainwindow()
    app.geometry("1920x1080")
    app.mainloop()

脚本 2:

class Page_one(tk.Frame):
    def __init__(self, parent, controller):
        mainframe=tk.Frame.__init__(self, parent)
        self.controller = controller

        #treeview widget attached to page_one
        tree1=Treeviews(...)
        tree1.place(x=880,y=25)

#Question1: How can I update the treeview widget with real-time data? 
#Question2: is there a way that I can change all treeview children simuteniously? (I dont want to delete all children and insert again)

我的问题是:有人可以向我展示一个结构,我可以用它来更新我的第二个脚本中的小部件。

您可以使用 item 方法修改树视图小部件:

tree.item(<item id>, text='new text', values=(...))

项目的 ID 在项目创建时返回。你可以通过将上面的代码放在 for 循环中来更改所有 treeview children:

for item in tree.get_children(<parent>):
    tree.item(item, text='new text', values=(...))

tree.get_children(<parent>) returns 项的子项('' 表示树的根)。

根据您的问题,我了解到您有一些生成数据的单独进程,并且您希望使用生成的新数据定期更新树视图内容。使用 time.sleep 会冻结主循环,所以你应该使用 after tkinter 方法:tree.after(<time in ms>, callback, *args) 将等待给定时间然后执行 callback(*args)。如果你想要定期回调,技巧是在 callback 内再次调用 after,例如:

def callback(x, y):
    # do something with x and y ...
    tree.after(2000, callback, x, y)

所以一旦你启动callback(0, 2),它将每2秒执行一次。

这是一个树视图示例:

import tkinter as tk
from tkinter import ttk

def update_item(item):
    val = int(tree.item(item, 'value')[0])
    tree.item(item, values=(val + 1,))
    root.after(1000, update_item, item)

def update_all_items():
    for item in tree.get_children():
        tree.item(item, values=(0,))

root = tk.Tk()
tree = ttk.Treeview(root, columns=('value'))
tree.heading('value', text='Value')

for i in range(5):
    tree.insert('', 'end', 'item%i' % i, text='item %i' % i, values=(i,))

update_item('item0')

tree.pack()
ttk.Button(root, text='Update', command=update_all_items).pack()

root.mainloop()