首页 > 解决方案 > Tkinter 主循环的预期流程是什么?Tkinter 正在冻结算法的时间流

问题描述

我是使用 tkinter 的新手,虽然我可以用 Python 制作东西,但我仍在学习。

对我来说,Tkinter 只是一个输出窗口或日志窗口。我正在编写的代码计算量很大,根本与接口无关。我希望在另一个模块中完成所有算法流程,然后在 TKinter 中抛出类似 drawOutput() 的东西。但似乎 Mainloop() 锁定了程序的时间和流程。

我是否打算将我的整个算法流程放在 TKinter 的循环中???

或者,它可能是多线程的,所以 Tkinter 一直被卡在绘制 GUI 分配但与我的主要软件无关?

我真的希望我所有的时间都在我的模块中流动,只是把东西扔到墙上给 Tkinter 来绘制它们,而不用停止或暂停我的主要算法的时间流。这可能吗?如何?非常感谢您的帮助。

标签: pythonalgorithmtkinterstructurepython-multithreading

解决方案


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()

推荐阅读