Python 关闭带有图形和画布的tkinter应用程序时出错

Python 关闭带有图形和画布的tkinter应用程序时出错,python,canvas,tkinter,scrollbar,figure,Python,Canvas,Tkinter,Scrollbar,Figure,当我调整右侧窗口的大小并展开窗口然后关闭窗口时,出现以下错误: _tkinter.TclError:无效的命令名“!滚动条” 也许它与画布小部件有关。 我试了很多,但是没有结果 有人能帮我吗 代码如下 import tkinter as tk from matplotlib.figure import Figure import numpy as np from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg root=tk

当我调整右侧窗口的大小并展开窗口然后关闭窗口时,出现以下错误: _tkinter.TclError:无效的命令名“!滚动条” 也许它与画布小部件有关。 我试了很多,但是没有结果

有人能帮我吗

代码如下

import tkinter as tk
from matplotlib.figure import Figure
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

root=tk.Tk()

vscrollbar = tk.Scrollbar(root)

canvasF2= tk.Canvas(root,yscrollcommand=vscrollbar.set)

vscrollbar.config(command=canvasF2.yview)
vscrollbar.pack(side=tk.RIGHT, fill=tk.Y) 

frame2=tk.Frame(canvasF2) #Create the frame which will hold the widgets

canvasF2.pack(side="left", fill="both", expand=True)

##Updated the window creation
canvasF2.create_window(0,0,window=frame2, anchor='nw')
#
fig = Figure(figsize=(10, 4), dpi=100)
t = np.arange(0, 3, .01)
a = fig.add_subplot(111)
a.plot(t, 2 * np.sin(2 * np.pi * t))

canvas = FigureCanvasTkAgg(fig, frame2)  # A tk.DrawingArea.
canvas.draw()
canvas.get_tk_widget().grid(row=4, column=0, columnspan=2, sticky="nswe")

def on_configure(event):    
    canvasF2.configure(scrollregion=canvasF2.bbox('all'))

root.bind('<Configure>', on_configure) 

root.mainloop()
将tkinter作为tk导入
从matplotlib.figure导入图形
将numpy作为np导入
从matplotlib.backends.backend_tkagg导入图CAVASTKAGG
root=tk.tk()
vscrollbar=tk.Scrollbar(根)
canvasF2=tk.Canvas(根,yscrollcommand=vscrollbar.set)
vscrollbar.config(命令=canvasF2.yview)
vscrollbar.pack(侧面=右侧,填充=右侧)
frame2=tk.Frame(canvasF2)#创建一个框架来容纳小部件
canvasF2.pack(side=“left”,fill=“both”,expand=True)
##更新了窗口创建
canvasF2.create_window(0,0,window=frame2,anchor='nw')
#
图=图(图尺寸=(10,4),dpi=100)
t=np.arange(0,3,01)
a=图add_子批次(111)
a、 图(t,2*np.sin(2*np.pi*t))
画布=图CAVASTKAGG(图,框架2)#一个传统绘图区域。
canvas.draw()
canvas.get_tk_widget().grid(行=4,列=0,列span=2,sticky=“nswe”)
def on_配置(事件):
配置(scrollregion=canvasF2.bbox('all'))
root.bind(“”,on_configure)
root.mainloop()

我不知道为什么在关闭窗口时会触发此错误,我猜是在关闭窗口后,小部件
canvasF2
没有被正确销毁。因此,如果我们在关闭窗口之前正确销毁
canvasF2
,则不会触发错误。我想会有更好的办法,但我就是这么做的

我处理了这个问题。我将此添加到代码的末尾,在主窗口被销毁之前销毁
canvasF2
没有错误

def close_window():
破坏
root.destroy()
协议(“WM_删除_窗口”,关闭_窗口)

完整代码:

将tkinter作为tk导入
从matplotlib.figure导入图形
将numpy作为np导入
从matplotlib.backends.backend_tkagg导入图CAVASTKAGG
root=tk.tk()
vscrollbar=tk.Scrollbar(根)
canvasF2=tk.Canvas(根,yscrollcommand=vscrollbar.set)
vscrollbar.config(命令=canvasF2.yview)
vscrollbar.pack(侧面=右侧,填充=右侧)
frame2=tk.Frame(canvasF2)#创建一个框架来容纳小部件
canvasF2.pack(side=“left”,fill=“both”,expand=True)
##更新了窗口创建
canvasF2.create_window(0,0,window=frame2,anchor='nw')
#
图=图(图尺寸=(10,4),dpi=100)
t=np.arange(0,3,01)
a=图add_子批次(111)
a、 图(t,2*np.sin(2*np.pi*t))
画布=图CAVASTKAGG(图,框架2)#一个传统绘图区域。
canvas.draw()
canvas.get_tk_widget().grid(行=4,列=0,列span=2,sticky=“nswe”)
def on_配置(事件):
配置(scrollregion=canvasF2.bbox('all'))
root.bind(“”,on_configure)
def关闭_窗口():
破坏
root.destroy()
协议(“WM_删除_窗口”,关闭_窗口)
root.mainloop()

希望这有帮助

我不知道为什么在关闭窗口时会触发此错误,我猜是在关闭窗口后小部件
canvasF2
没有被正确销毁。因此,如果我们在关闭窗口之前正确销毁
canvasF2
,则不会触发错误。我想会有更好的办法,但我就是这么做的

我处理了这个问题。我将此添加到代码的末尾,在主窗口被销毁之前销毁
canvasF2
没有错误

def close_window():
破坏
root.destroy()
协议(“WM_删除_窗口”,关闭_窗口)

完整代码:

将tkinter作为tk导入
从matplotlib.figure导入图形
将numpy作为np导入
从matplotlib.backends.backend_tkagg导入图CAVASTKAGG
root=tk.tk()
vscrollbar=tk.Scrollbar(根)
canvasF2=tk.Canvas(根,yscrollcommand=vscrollbar.set)
vscrollbar.config(命令=canvasF2.yview)
vscrollbar.pack(侧面=右侧,填充=右侧)
frame2=tk.Frame(canvasF2)#创建一个框架来容纳小部件
canvasF2.pack(side=“left”,fill=“both”,expand=True)
##更新了窗口创建
canvasF2.create_window(0,0,window=frame2,anchor='nw')
#
图=图(图尺寸=(10,4),dpi=100)
t=np.arange(0,3,01)
a=图add_子批次(111)
a、 图(t,2*np.sin(2*np.pi*t))
画布=图CAVASTKAGG(图,框架2)#一个传统绘图区域。
canvas.draw()
canvas.get_tk_widget().grid(行=4,列=0,列span=2,sticky=“nswe”)
def on_配置(事件):
配置(scrollregion=canvasF2.bbox('all'))
root.bind(“”,on_configure)
def关闭_窗口():
破坏
root.destroy()
协议(“WM_删除_窗口”,关闭_窗口)
root.mainloop()

希望这有帮助

完美、干净、亮丽的解决方案:按预期工作。完美、干净、亮丽的解决方案:按预期工作。