根之后不调用回调函数

时间:2018-09-03 21:01:22

标签: python tkinter

我试图在一个函数中实现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函数放到新线程中,但它一直死机。

我希望我说清楚了。

最诚挚的问候。

1 个答案:

答案 0 :(得分:1)

您永远不会给事件循环提供处理事件的机会,因此它们只会不断堆积。

一般而言,由于mainloop()已经是一个无限循环,因此您不应在tkinter程序中运行无限循环。

一种快速,低效的解决方法是在内部循环内调用root.update_idletasks()。更好的解决方案是重构代码,以便在另一个潜在的无限循环(while flag == True:)中没有无限循环(while graph_data.shape[0] < 64)。