Ошибка при закрытии приложения tkinter с рисунком и холстом - PullRequest
1 голос
/ 03 апреля 2020

Я получаю следующую ошибку, когда изменяю размер правой стороны, расширяю окно и затем закрываю его: _tkinter.TclError: неверное имя команды ".! Scrollbar" Возможно, это связано с виджетом canvas. Я много пробовал, но безрезультатно.

Может кто-нибудь мне помочь?

Код ниже

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

1 Ответ

0 голосов
/ 03 апреля 2020

Я не уверен, почему эта ошибка возникает при закрытии окна, я думаю, что после закрытия окна виджет canvasF2 не уничтожается должным образом. Поэтому, если мы правильно уничтожим canvasF2 перед закрытием окна, ошибка не сработает. Я думаю, что будет лучший способ сделать это, но вот что я сделал.

Я обработал удаление окна, используя протокол метод . Я добавил это в конец вашего кода и не получил ошибку, уничтожив 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()

Надеюсь, это поможет!

...