tkinter обновляет только видимый кадр, используя после - PullRequest
0 голосов
/ 06 марта 2019

Я пишу графический интерфейс, который принимает и отображает данные в реальном времени от нескольких датчиков. У меня есть различные рамки в моем GUI, между которыми вы можете перемещаться. В этот момент каждый кадр обновляется с частотой 25 Гц с помощью вызова метода after.

Я думаю (но я не уверен), что кадры также обновляются, даже когда они скрыты для пользователя (когда пользователь видит другой кадр). Это, конечно, пожирает ресурсы, поэтому мне было интересно, как обновить кадр, только когда вы на него смотрите?

1 Ответ

0 голосов
/ 06 марта 2019

Вот простой пример, который показывает, как можно отследить, какой кадр в настоящий момент является верхним, и обновить только данные этого кадра.

Это не единственный и, возможно, даже не лучший способ, но он должен послужить вам отправной точкой.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...