#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. Я протестировал его в своем коде, и он работает идеально. Еще раз спасибо!