sub-window 中的小部件使用 tkinter python 中的 real-time 数据更新
widget in sub-window update with real-time data in tkinter python
我试过使用 after/time.sleep 来更新树视图,但它不适用于主循环。
我的问题是:
- 如何使用 real-time 数据更新树视图小部件?
- 有没有办法可以同时更改所有树视图 children? (我不想删除所有 children 并再次插入)
脚本 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()
我试过使用 after/time.sleep 来更新树视图,但它不适用于主循环。
我的问题是:
- 如何使用 real-time 数据更新树视图小部件?
- 有没有办法可以同时更改所有树视图 children? (我不想删除所有 children 并再次插入)
脚本 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()