这是我的代码:
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进行此操作以及为什么会出现此问题?
谢谢!抱歉我的英语不好。
答案 0 :(得分:0)
将线程与GUI混合,尤其是tk,非常棘手。我不知道所有的规则,但不可预测的异常和死锁是两个问题。我有点惊讶的是,在主线程和mainloop的单独线程中生成一个事件甚至曾经工作过一次。 (你为什么要这样做?)在同一个线程中运行的简化函数可以一致地工作。
def test():
root.event_generate('<<showDialog>>')