python - Tkinter 主循环的预期流程是什么?Tkinter 正在冻结算法的时间流
问题描述
我是使用 tkinter 的新手,虽然我可以用 Python 制作东西,但我仍在学习。
对我来说,Tkinter 只是一个输出窗口或日志窗口。我正在编写的代码计算量很大,根本与接口无关。我希望在另一个模块中完成所有算法流程,然后在 TKinter 中抛出类似 drawOutput() 的东西。但似乎 Mainloop() 锁定了程序的时间和流程。
我是否打算将我的整个算法流程放在 TKinter 的循环中???
或者,它可能是多线程的,所以 Tkinter 一直被卡在绘制 GUI 分配但与我的主要软件无关?
我真的希望我所有的时间都在我的模块中流动,只是把东西扔到墙上给 Tkinter 来绘制它们,而不用停止或暂停我的主要算法的时间流。这可能吗?如何?非常感谢您的帮助。
解决方案
mainloop()
正如你所说的那样 - 它使程序停在它所在的位置,直到 GUI 循环退出。您需要做的是将您的程序逻辑放在一个单独的线程中(可能是一个完全独立的类)。
import Threading
import tkinter as tk
class worker(object):
def __init__(self):
self.terminating = False
# setup important stuff here
def terminate(self):
self.terminating = True
def start(self):
workerthread = threading.Thread(target=self.do_work, name="myapp-worker")
workerthread.start()
def do_work(self, args):
while not self.terminating:
# Do stuff that needs to carry on forever until someone presses stop in the GUI
class GUI(object):
def __init__(self):
# Instantiate GUI variables here
def set_worker(self, myworker):
# Keep a reference to the connected worker object. Avoid doing this both ways or you'll get a circular reference.
self.worker = myworker
def setup(self):
root = tk.Tk()
self.root = root
# Set up all your widgets here, but *don't* call mainloop()
def close(self):
# Call this from your close button in the GUI
self.worker.terminate()
def run(self):
self.root.mainloop()
def main():
myworker = worker()
mygui = GUI()
mygui.set_worker(myworker)
mygui.setup()
myworker.start()
mygui.run()
if __name__ == "__main__":
main()
推荐阅读
- rust - 为什么我的`no_std`程序可以编译,即使它以某种方式依赖`std`
- javascript - 如何计算 CloudFlare Worker 中的 Http 请求标头大小?
- api - 平行点中的 Adalo + 情感 api
- google-cloud-platform - Google Cloud Platform 中 BigQuery 的计划查询中的 FileNotFoundException
- javascript - React - 无法读取未定义的属性“值”
- salesforce - 如何在 Aura 组件中绑定地图的动态键
- android - 如何在最小化应用程序后坚持导航组件目的地
- python - 在 TensorFlow 数据集上应用预处理需要很长时间
- ui-automation - 微软团队 | 无障碍洞察 | 双显示器
- java - Kotlin - 如何在 Hibernate 中查询通用 KClass 模型的列表?