python - 方法/线程块之后的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)
解决方案
问题是,tkinter 之后的实现是什么?
归根结底,这真的很简单。Tkinter 的mainloop
方法只不过是一个无限循环,等待项目出现在事件队列中。当它找到一个事件时,它将它从队列中拉出并调用该事件的处理程序。
after
只需将一个项目放在事件队列中。在 tkinter 的每次迭代期间,mainloop
将检查由 添加的函数的时间戳after
,如果给定的时间已经过去,则该函数将从队列中拉出并运行。
推荐阅读
- javascript - :: 一次绑定的表示法不适用于 AnguarJS 1.6.4
- java - 控制器中的 Spring Boot 覆盖功能
- angular - 在 Angular CLI 项目中找不到源文件
- javascript - How to load external script with optimized require.js?
- spring-boot - 在 Kotlin 中使用 Jpa 注释从基类继承父属性
- java - Spring Integration DSL ScatterGather 流块
- javascript - 使用 JQuery 验证器对输入进行实时验证
- scala - Slick:使用 Rep[Seq[T]] 过滤
- sql - 使用具有多个 where 的 suqbqueries 的多个连接子句
- java - 如何显示 @ResponseStatus 错误的自定义错误消息?