作为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')
答案 0 :(得分:0)
此问题是由于使用tkinter编写了IDLE。
tkinter对资源和线程非常挑剔。 PySimpleGUI文档中有关于在线程环境中使用PySimpleGUI的警告,因为您可能会遇到这样的情况,即在错误的线程中释放了资源,或者tkinter对谁在运行主循环感到困惑。
这是一篇较旧的文章,谈论使用IDLE时运行多个主循环的问题。
https://groups.google.com/forum/#!topic/comp.lang.python/kr7lKj4qMl4