我试图在一个函数中实现root.after,以便给传感器一点时间来读取,但是我无法使其工作。这是我无法使其正常运行的功能代码:
def read_wifi():
global graph_data
try:
del graph_data
except:
pass
graph_data=np.array([0])
flag = True
while graph_data.shape[0] < 64:
while flag == True:
texto='LX'
connection.send(texto.encode())
def callback_after():
global graph_data
print('a')
graph_data=connection.recv(1024).decode()
connection.settimeout(3)
graph_data=graph_data[:-2]
graph_data=graph_data[0:]
graph_data=graph_data[:].split()
graph_data = np.nan_to_num(graph_data)
try:
graph_data = np.array([float(q) for q in graph_data])
flag = False
except:
print('Error de lectura del sensor. Reintentando leer...')
if graph_data.shape[0]<64:
print('Error de lectura del sensor. Reintentando leer...')
root.after(500,callback_after)
try:
graph_data = graph_data*m+b
except:
pass
graph_data = np.reshape(graph_data,[4,16])
如您所见,我添加了一行来打印'a',只是为了检查代码是否进入了callback_after函数,但从未被打印出来,所以我认为问题出在root.after(500,callback_after )行。
如果我未实现回调函数,则root似乎可以正常工作,但每次从传感器读取tk窗口时,冻结。我还尝试将read_wifi函数放到新线程中,但它一直死机。
我希望我说清楚了。
最诚挚的问候。
答案 0 :(得分:1)
您永远不会给事件循环提供处理事件的机会,因此它们只会不断堆积。
一般而言,由于mainloop()
已经是一个无限循环,因此您不应在tkinter程序中运行无限循环。
一种快速,低效的解决方法是在内部循环内调用root.update_idletasks()
。更好的解决方案是重构代码,以便在另一个潜在的无限循环(while flag == True:
)中没有无限循环(while graph_data.shape[0] < 64
)。