方法

时间:2015-07-07 04:02:03

标签: python tkinter

我在Tkinter GUI工作了很长一段时间。而我想知道after方法如何实际起作用。我的问题很简单。

  1. 如何在Tkinter内部实现after方法?
  2. after调用是否已线程化?
  3. Tkinter中多个after来电的缺点(如果有的话)是什么?
  4. 如何安排after回调?
  5. 我确实经历过this之类的几个链接。但是无法获得这些信息。

2 个答案:

答案 0 :(得分:3)

  1. after()调用Tck / Tk的after命令,该命令注册稍后由Tcl / Tk事件循环调用的回调。

  2. after()来电没有线程。

  3. 一个问题是,阻止或长时间运行的操作可能会导致after()计划的某些内容的运行时间明显晚于您的意思。还有许多可能相关的利弊,但您需要指明您的疑虑或用例......

  4. 回调被注册到Tcl / Tk事件循环中,它负责调度。有关其工作原理的详细信息,请参阅the documentation

  5. 说明:

    您可能已经知道,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只是将一个带时间戳的事件添加到队列中。没有线程。