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

Python RuntimeError:使用tkinter.simpledialog时主线程不在主循环中,python,multithreading,python-3.x,tkinter,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=('<<showDi

这是我的密码:

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

我最近在学习python,这段代码只是一个演示。我想在按下子线程中的按钮后做一些工作,因为这需要几秒钟的时间,我不想卡住UI。当工作完成时,它将显示一个对话框

有人能告诉我如何使用tkinter实现这一点,以及为什么会出现此问题吗


谢谢!很抱歉我的英语很差。

将线程与GUI,特别是tk混合使用是很棘手的。我不知道所有的规则,但不可预测的异常和死锁是两个问题。我有点惊讶,在独立于主线程和mainloop的线程中生成事件甚至可以工作一次。你为什么要这么做?在同一线程中运行的简化函数的工作方式是一致的

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

这段代码只是一个演示。我想在按下子线程中的按钮后做一些工作,因为这需要几秒钟的时间,而且我不想卡住UI。当工作完成时,它将显示一个对话框。我如何使用tk实现这一点?可能性1:在单独的线程中工作,在完成时将“done”变量设置为true。同时,使用主线程回调来监视“完成”,主线程回调每秒钟或半秒检查一次,或以任何间隔检查一次,并在线程完成时显示对话框。可能性2:在空闲任务中分小段执行主线程中的工作,每段工作完成后将控制权返回主循环。
def test():
    root.event_generate('<<showDialog>>')