H.E.p.公司-
传统的方法确实涉及到使用一个单独的线程,并使用某种轮询或事件机制来协调“worker”线程和GUI线程之间的工作。在
但是,正如thomask.所指出的,这可能会变得非常复杂和棘手,尤其是对于Python使用全局解释器锁(GIL)等,并且还必须处理Tkinter的处理循环。在
(使用多线程GUI的唯一理由是,如果您绝对必须确保GUI在可能长时间运行的后台任务期间保持响应,我不认为这是本例中的问题。)
相反,我建议使用基于生成器的“协同例程”类型的体系结构。
正如第6.8节“Python(2.7)语言参考”中所述,[定义生成器函数时使用“yield”语句,并且仅在生成器函数体中使用。在函数定义中使用yield语句足以使该定义创建一个生成函数,而不是普通函数。]
(这有效地构成了协同程序体系结构的基础。(编辑)
[当一个生成器函数被调用时,它返回一个称为生成器迭代器的迭代器,或者更常见的是一个生成器。生成器函数的主体是通过反复调用生成器的next()方法来执行的,直到它引发异常为止。在
执行yield语句时,生成器的状态被冻结,expression\u list的值返回给next()的调用方。“冻结”意味着所有的局部状态都会被保留,包括本地变量的当前绑定、指令指针和内部计算堆栈:保存了足够的信息,以便下次调用next()时,函数可以像yield语句只是另一个外部调用一样继续执行。]
(另请参阅“PEP 0342-通过增强的生成器协同程序”,了解更多背景和一般信息。)
这将允许GUI根据需要调用算法规范生成器的下一部分,而不必在操作员按下“下一步”按钮之前将其置于休眠状态。
基本上,您只需创建一个“特定于域的语言”(DSL),它只包含表示该特定算法的步骤列表,生成器(迭代器)将在调用时(按需)执行下一步。在
更简单,更容易维护。在