使用PySimpleGUI显示matplotlib图形时出现Tkinter错误的原因
我目前正在使用PySimpleGUI开发Python中的GUI,并正在主窗口包含的框架中绘制一些图形。我使用这个示例代码成功地做到了这一点,但是,当我在绘制图形后关闭主窗口时,我得到了与Tkinter相关的以下错误列表:使用PySimpleGUI显示matplotlib图形时出现Tkinter错误的原因,matplotlib,tkinter,pysimplegui,Matplotlib,Tkinter,Pysimplegui,我目前正在使用PySimpleGUI开发Python中的GUI,并正在主窗口包含的框架中绘制一些图形。我使用这个示例代码成功地做到了这一点,但是,当我在绘制图形后关闭主窗口时,我得到了与Tkinter相关的以下错误列表: Exception in Tkinter callback\ Traceback (most recent call last):\ File "/usr/lib64/python3.6/tkinter/__init__.py", line 1705,
Exception in Tkinter callback\
Traceback (most recent call last):\
File "/usr/lib64/python3.6/tkinter/__init__.py", line 1705, in __call__\
return self.func(*args)\
File "/usr/lib64/python3.6/tkinter/__init__.py", line 3072, in set\
self.tk.call(self._w, 'set', first, last)\
_tkinter.TclError: invalid command name\ ".!toplevel.!frame.!notebook.!frame4.!frame4.!tkscrollableframe.!scrollbar2"\
Exception in Tkinter callback\
Traceback (most recent call last):\
File "/usr/lib64/python3.6/tkinter/__init__.py", line 1705, in __call__\
return self.func(*args)\
File "/usr/lib64/python3.6/tkinter/__init__.py", line 3072, in set\
self.tk.call(self._w, 'set', first, last)\
_tkinter.TclError: invalid command name\ ".!toplevel.!frame.!notebook.!frame4.!frame4.!tkscrollableframe.!scrollbar"\
Exception in Tkinter callback\
Traceback (most recent call last):\
File "/usr/lib64/python3.6/tkinter/__init__.py", line 1705, in __call__\
return self.func(*args)\
File "/usr/lib64/python3.6/tkinter/__init__.py", line 3072, in set\
self.tk.call(self._w, 'set', first, last)\
_tkinter.TclError: invalid command name\ ".!toplevel.!frame.!notebook.!frame4.!frame4.!tkscrollableframe.!scrollbar2"\
Exception in Tkinter callback\
Traceback (most recent call last):\
File "/usr/lib64/python3.6/tkinter/__init__.py", line 1705, in __call__\
return self.func(*args)\
File "/usr/lib64/python3.6/tkinter/__init__.py", line 3072, in set\
self.tk.call(self._w, 'set', first, last)\
_tkinter.TclError: invalid command name\ ".!toplevel.!frame.!notebook.!frame4.!frame4.!tkscrollableframe.!scrollbar"\
我是matplotlib新手,以前从未使用过Tkinter,但如果有人知道,我想知道这些错误的原因。我的代码相当大,但如果需要,我可以将其添加到帖子中。
我试着注释代码的不同部分以找到罪魁祸首,当我删除与我使用的演示中的以下内容对应的行时,错误停止了:
figure_canvas_agg = FigureCanvasTkAgg(figure, canvas)
以前有人遇到过这个问题吗?我在运行Centos的机器上运行这个程序,并尝试在Windows中运行一个更简单的程序,该程序关闭时没有任何问题
提前谢谢
编辑1:根据请求,我刚刚添加了我可以生成的最简单的Python代码,它再现了这种错误:
import PySimpleGUI as sg
import matplotlib as mp
from matplotlib import figure
from matplotlib.backends import backend_tkagg
import numpy as np
layout1 = [
[
sg.Frame("Frame",
[
[
sg.Column(
[
[sg.Canvas(key="-CANVAS-")]
],
size=(1000,1000)
)
]
]
)
]
]
layout2 = [
[sg.Column(layout1, scrollable=True)]
]
window = sg.Window("Window", layout2)
window.finalize()
x = np.array(list(range(10)))
fig = figure.Figure()
ax = fig.add_axes((0,0,1,1))
ax.plot(x, x)
figure_canvas_tkagg = backend_tkagg.FigureCanvasTkAgg(fig, master=window["-CANVAS-"].TKCanvas)
figure_canvas_tkagg.draw()
figure_canvas_tkagg.get_tk_widget().pack()
while True:
event, values = window.read()
if event == sg.WINDOW_CLOSED:
break
window.close()
这似乎与我的GUI代码由cointainer对象中的许多级别的容器对象组成这一事实有关。在我的完整代码中,我在这上面有几个层,但在我建立了以下层次结构之后,错误似乎出现了:
纵队
框架
纵队
帆布
应该注意的是,使用VisualStudio代码的调试器,我发现错误并不完全发生在窗口关闭时(调用window.close()方法时),而是发生在一段时间之前
编辑2:我刚刚对它进行了测试,出于某种原因,只有在Centos机器上运行附加的Python脚本时才会发生此错误,而不是在Windows中
编辑3:我发现如果在关闭窗口之前关闭我创建的所有图形,这些错误将不会发生。然而,这并不是一个完整的解决方案,因为错误发生在PySimpleGUI的window.close()命令运行之前,所以我不知道在窗口关闭的情况下将关闭图形的代码放在哪里。您能给我们展示一些产生错误的最小代码吗?只是在运行脚本后添加了一些代码没有错误。从失败消息来看,它似乎设置了滚动条的位置,但滚动条不存在,这可能是由于窗口已被破坏或关闭造成的。因此,您在尝试运行脚本时没有任何问题?真奇怪。但我不知道为什么滚动条会导致这个问题。另一方面,我不知道PySimpleGUI所构建的底层Tkinter是如何工作的,因此它可能是PySimpleGUI实现中的某种东西。至少它不会影响我的GUI的功能,因为在我关闭它之前,错误不会发生,但最好将它们清除掉。