RuntimeError:使用tkinter.simpledialog时主线程不在主循环中

时间:2014-11-04 20:14:28

标签: python multithreading python-3.x tkinter

这是我的代码:

import threading
import tkinter.simpledialog

def showDialog(evt):
    dlg = tkinter.simpledialog.SimpleDialog(root,text='Test!', buttons=['OK'])
    dlg.go()

def test():
    threading.Thread(target=root.event_generate, args=('<<showDialog>>',)).start()

root = tkinter.Tk()
root.bind('<<showDialog>>',showDialog)
tkinter.Button(text = 'showDialog',command = test).pack()
root.mainloop()

我使用Python3.4运行此代码

我第一次点击showDialog Button时效果很好

但是如果我按OK然后再次单击该按钮,则会引发RuntimeError:

Exception in thread Thread-2:
Traceback (most recent call last):
  File "D:\Program Files\Python34\lib\threading.py", line 921, in _bootstrap_inner
    self.run()
  File "D:\Program Files\Python34\lib\threading.py", line 869, in run
    self._target(*self._args, **self._kwargs)
  File "D:\Program Files\Python34\lib\tkinter\__init__.py", line 1501, in event_generate
    self.tk.call(args)
RuntimeError: main thread is not in main loop

我最近在学习python,这段代码只是一个demo.I想在子线程中按下按钮后做一些工作,因为它会花费几秒钟而且我不想卡住UI。工作完成后,它将显示一个对话框。?

有人可以告诉我如何使用tkinter进行此操作以及为什么会出现此问题?

谢谢!抱歉我的英语不好。

1 个答案:

答案 0 :(得分:0)

将线程与GUI混合,尤其是tk,非常棘手。我不知道所有的规则,但不可预测的异常和死锁是两个问题。我有点惊讶的是,在主线程和mainloop的单独线程中生成一个事件甚至曾经工作过一次。 (你为什么要这样做?)在同一个线程中运行的简化函数可以一致地工作。

def test():
    root.event_generate('<<showDialog>>')