【问题标题】:Error when closing tkinter app with figure and canvas使用图形和画布关闭 tkinter 应用程序时出错
【发布时间】:2020-04-03 16:11:39
【问题描述】:

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

谁能帮帮我?

代码如下

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

【问题讨论】:

  • 完美、干净和出色的解决方案:它按预期工作。

标签: python canvas tkinter scrollbar figure


【解决方案1】:

我不确定为什么在关闭窗口时会触发此错误,我的猜测是在关闭窗口后,小部件 canvasF2 没有被正确销毁。因此,如果我们在关闭窗口之前正确销毁canvasF2,则不会触发错误。我认为会有更好的方法来做到这一点,但这就是我所做的。

我处理了deletion of the window by using protocol method。我将此添加到代码的末尾,并且在销毁主窗口之前销毁canvasF2 没有出错。

def close_window():
    canvasF2.destroy()
    root.destroy()

root.protocol("WM_DELETE_WINDOW", close_window)

完整代码:

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) 


def close_window():
    canvasF2.destroy()
    root.destroy()

root.protocol("WM_DELETE_WINDOW", close_window)

root.mainloop()

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多