【问题标题】:root after doesn't call the callback functionroot after 不调用回调函数
【发布时间】:2018-09-03 21:01:21
【问题描述】:

我正在尝试在一个函数中实现 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 after 似乎可以工作,但我的 tk 窗口每次从传感器读取时都会冻结。我还尝试将 read_wifi 函数放在一个新线程中,但它一直冻结。

我希望我说清楚了。

最好的问候。

【问题讨论】:

  • 为什么你的代码会退出while flag == True:循环?你只是一直在排队 root.after 电话永远永远。

标签: python tkinter


【解决方案1】:

你永远不会给事件循环一个处理事件的机会,所以它们只会不断堆积。

作为一般经验法则,您不应该在 tkinter 程序中运行无限循环,因为 mainloop() 已经是一个无限循环。

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

【讨论】:

  • 感谢您的回答。问题在于,如果传感器有读取问题,两个循环都会结束,如果传感器给出所有 64 个数字,则第一个循环结束,如果不包含任何字符串,则另一个循环结束。我应该以不同的方式编写循环吗?我是初学者,所以有很多我不知道的事情。再次感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 2016-11-28
相关资源
最近更新 更多