我在Tkinter GUI工作了很长一段时间。而我想知道after
方法如何实际起作用。我的问题很简单。
after
方法?after
调用是否已线程化?after
来电的缺点(如果有的话)是什么?after
回调?我确实经历过this之类的几个链接。但是无法获得这些信息。
答案 0 :(得分:3)
after()
调用Tck / Tk的after
命令,该命令注册稍后由Tcl / Tk事件循环调用的回调。
after()
来电没有线程。
一个问题是,阻止或长时间运行的操作可能会导致after()
计划的某些内容的运行时间明显晚于您的意思。还有许多可能相关的利弊,但您需要指明您的疑虑或用例......
回调被注册到Tcl / Tk事件循环中,它负责调度。有关其工作原理的详细信息,请参阅the documentation。
您可能已经知道,Tkinter在内部使用Tcl/Tk。
看一下the code for the after()
method,看来Tkinter只是调用Tcl / Tk after
命令。
documentation for Tcl/Tk's after
command没有提及线程的任何内容。这在Tcl/Tk's single-threaded event loop design给出了意义。
所以,我的结论是Tkinter的after()
方法不使用线程,而只是使用内部Tcl / Tk after
命令注册回调,这将是Tcl/Tk event loop在最合适的时间召唤。
答案 1 :(得分:0)
它非常简单:Tkinter维护要完成的工作队列(事件队列),以及排队的mainloop
(以及update
)进程。 after
只是将一个带时间戳的事件添加到队列中。没有线程。