tkinter обновляет видимый кадр только с помощью after

#python-3.x #tkinter

#python-3.x #tkinter

Вопрос:

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

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

Комментарии:

1. Используйте переменную отслеживания. Когда фрейм скрыт, убедитесь, что эта переменная обновлена, и в вашем методе, который запускает оператор after, вы добавляете if оператор, который сначала проверяет, скрыт ли фрейм.

Ответ №1:

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

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

 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()
  

Комментарии:

1. Спасибо! Настолько просто, странно, что я не смог найти это в Интернете. Я еще не тестировал это в своем коде, но пример работает, поэтому он должен работать и с моим кодом.

2. Я протестировал его в своем коде, и он работает идеально. Еще раз спасибо!