首页 > 解决方案 > 方法/线程块之后的Tkinter

问题描述

after()我对 TKinter方法有一个奇怪的问题。我在主线程中调用函数func_a()(阻塞调用需要一些毫秒)并定期读取一个值。它就像一个魅力,我可以在执行过程中获得一些更新的价值func_b()after()func_a()

我不需要任何图形界面,所以我不再使用 TKinter,现在我func_a()在主线程中调用。我创建了一个单独的线程来调用func_b(). 问题是调用func_a()停止func_b()单独线程的执行。我需要等待func_a()返回有一些定期调用func_b(). 我没有func_a()func_b()(python C 绑定)的来源。但也许某些线程锁定机制会阻止func_b()调用时func_a()调用。

问题是,tkinter 之后的实现是什么?如何实现与 Tkinter 相同的行为after():能够在调用func_b()func_a()调用,而不使用 TKinter?

代码如下所示:

pos_th= threading.Thread(target=read_pos, args=(0.1,))
pos_th.daemon = True
pos_th_stop = False
pos_th.start()
func_a()

def read_pos(period):
    while not pos_th_stop :
        func_b()
        time.sleep(period)

标签: pythonmultithreadingtkinter

解决方案


问题是,tkinter 之后的实现是什么?

归根结底,这真的很简单。Tkinter 的mainloop方法只不过是一个无限循环,等待项目出现在事件队列中。当它找到一个事件时,它将它从队列中拉出并调用该事件的处理程序。

after只需将一个项目放在事件队列中。在 tkinter 的每次迭代期间,mainloop将检查由 添加的函数的时间戳after,如果给定的时间已经过去,则该函数将从队列中拉出并运行。


推荐阅读