PySimpleGUI。 RuntimeError:主线程不在主循环中

时间:2019-01-21 15:40:58

标签: python multithreading

作为Python学习者,我决定尝试PySimpleGUI,并编写了一个脚本,其中的相关片段为:

`    
import PySimpleGUI as sg 
....
window = sg.Window('Output Filename Creator').Layout(layout)
while True:
    event, values = window.Read()
    if event is None  or event == "Cancel":
        window.Close()
        sys.exit()
    else:
        outfile = values['file']
        window.Close()
        return outfile    `  

我使用Windows 10,Python 3.7,Idle 3.7和PySimpleGUI-3.24.0。运行包含以上代码段的脚本(没有执行错误)后,我转到Idle shell并尝试输入len('1')。输入开括号时,会产生以下错误:

Traceback (most recent call last): File "C:\Users\Paul\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 332, in __del__ if self._tk.getboolean(self._tk.call("info", "exists", self._name)): RuntimeError: main thread is not in main loop

我知道PySimpleGUI基于tkinter,但是据我所知。我不知道线程在Python中的工作方式或PySimpleGUI与Tk的接口。但是我想知道错误的出处以及如何避免该错误。

更新:通过单击右上角的十字来关闭窗口时,简化为基本内容的代码仍然会给出相同的错误:

def OutputFileName(default):
    import PySimpleGUI as sg      

    layout = [
              [sg.In(default, key='file', size=(70,1)),
               sg.SaveAs('Browse')],
              [sg.Save(), sg.Text(' '*35), sg.Cancel()]
            ]

    window = sg.Window(' ').Layout(layout)
    event, values = window.Read()
    if event is None or event == "Cancel":
        return
    elif event == 'Save':
        return values['file']
outf = OutputFileName('foo.txt')

1 个答案:

答案 0 :(得分:0)

此问题是由于使用tkinter编写了IDLE。

tkinter对资源和线程非常挑剔。 PySimpleGUI文档中有关于在线程环境中使用PySimpleGUI的警告,因为您可能会遇到这样的情况,即在错误的线程中释放了资源,或者tkinter对谁在运行主循环感到困惑。

这是一篇较旧的文章,谈论使用IDLE时运行多个主循环的问题。

https://groups.google.com/forum/#!topic/comp.lang.python/kr7lKj4qMl4