tkinter仅使用after刷新可见帧

时间:2019-03-06 15:26:15

标签: python-3.x tkinter

我正在编写一个GUI,该GUI可以接收并显示来自多个传感器的实时数据。我的GUI中有不同的框架,您可以在这些框架之间进行导航。此刻,使用“ after”方法调用以25Hz刷新每个帧。

我认为(但我不确定)即使用户隐藏了(当用户看到另一个帧时),这些框架也会刷新。当然,这会占用资源,所以我想知道如何仅在查看帧时刷新帧?

1 个答案:

答案 0 :(得分:0)

这是一个简单的示例,它显示了如何跟踪当前最顶部的帧并仅更新该帧的数据。

这不是唯一的方法,甚至可能不是最好的方法,但是它应该为您提供一个起点。

import tkinter as tk


root = tk.Tk()
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
timer1 = 0
timer2 = 0
frame1 = tk.Frame(root)
frame2 = tk.Frame(root)
frame2.grid(row=0, column=0, sticky='nsew')
frame1.grid(row=0, column=0, sticky='nsew')
frame1.tkraise()

current_active_frame = frame1

lbl1 = tk.Label(frame1, text='Active Counter at: 0')
lbl2 = tk.Label(frame2, text='Active Counter at: 0')
lbl1.grid(row=0, column=0, sticky='nsew')
lbl2.grid(row=0, column=0, sticky='nsew')
tk.Button(frame1, text='Switch to frame 2', command=lambda: raise_frame(frame2)).grid(row=1, column=0, sticky='nsew')
tk.Button(frame2, text='Switch to frame 1', command=lambda: raise_frame(frame1)).grid(row=1, column=0, sticky='nsew')


def raise_frame(frame):
    global current_active_frame
    frame.tkraise()
    current_active_frame = frame


def update_while_active():
    global timer1, timer2
    if current_active_frame == frame1:
        print('frame1')
        timer1 += 1
        lbl1.config(text='Active Counter at: {}'.format(timer1))
    if current_active_frame == frame2:
        print('frame2')
        timer2 += 1
        lbl2.config(text='Active Counter at: {}'.format(timer2))
    root.after(1000, update_while_active)

update_while_active()
root.mainloop()