Как избежать блокировки графического интерфейса tkinter во время выполнения бесконечного цикла?

#python #tkinter #time #infinite-loop

#python #tkinter #время #бесконечный цикл

Вопрос:

Я создал следующую программу для изменения яркости экрана в зависимости от времени суток. Он использует бесконечный цикл для постоянной проверки времени, но это также не позволяет пользователю изменять значения в окне tkinter или закрывать его. Есть ли какой-нибудь способ избежать этого?

 from datetime import datetime
import screen_brightness_control as sbc
from tkinter import *
m=Tk()
m.title('Brightness Control')
def saver():
    print("Saving")
    global brit
    brit=e3.get()
    global frot
    frot=e1.get()
    global tot
    tot=e2.get()
    a=True
    while a==True:
        current_brightness=sbc.get_brightness()
        now=datetime.now().time()
        if now.hour>int(frot) and now.hour<int(tot) :
            sbc.set_brightness(brit)
        else:
            sbc.set_brightness(40)

Label(m, text='Brightness').grid(row=0,column=0) 
Label(m, text='From').grid(row=1,column=0) 
Label(m, text='To').grid(row=1,column=2) 

e1 = Entry(m)
e2 = Entry(m)
e3 = Entry(m)

e1.grid(row=1, column=1) 
e2.grid(row=1, column=3)
e3.grid(row=0, column=1) 
button = Button(m, text='Save', width=5,command=saver) 
button.grid(row=2,column=3)
m.mainloop()
 

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

1. добавьте m.update() в начале вашего цикла while

2. В основном потоке следует избегать цикла While, поскольку он блокирует основной цикл tkinter. Попробуйте использовать .after() вместо этого.

Ответ №1:

Вы должны добавить <tk.Tk object>.update() что-нибудь в свой while цикл следующим образом:

 import tkinter as tk

root = tk.Tk()
button = tk.Button(root, text="This is a button")
button.pack()

while True:
    root.update()
 

root.update() обновляет tcl, и это останавливает сообщение «программа не отвечает».