python tk tkinter在我的可滚动框架中无法承受多个画布

问题描述

import tkinter as tk
from tkinter import filedialog
from matplotlib.backends.backend_tkagg import (figureCanvasTkAgg,NavigationToolbar2Tk) 
from matplotlib.figure import figure 
import matplotlib.pyplot as plt
from data import dataprocess
root = tk.Tk()
root.geometry('1500x800')
container = tk.Frame(root)
main_canvas = tk.Canvas(container,width=1480,height=800,bg='blue')
scrollbar = tk.Scrollbar(container,orient="vertical",command=main_canvas.yview)
scrollable_frame = tk.Canvas(main_canvas,bg='black')
scrollable_frame.bind(
"<Configure>",lambda e: main_canvas.configure(
    scrollregion=main_canvas.bBox("all")
    )
)

main_canvas.create_window((0,0),window=scrollable_frame,anchor="nw")

main_canvas.configure(yscrollcommand=scrollbar.set)

for i in range(100):
    f = figure(figsize=(5,5),dpi=100)
    a = f.add_subplot(111)
    a.plot([1,2,3,4,5,6,7,8],[5,1,8,9,5])
    a.set_title("fig" + str(i))
    canvas = figureCanvasTkAgg(f,master = scrollable_frame)
    canvas.draw()
    canvas.get_tk_widget().grid(row=i,column=0)

container.grid()
main_canvas.grid()
scrollbar.grid(row=0,column=1,sticky="nse")
container.mainloop()

我想在可伸缩框架上生成许多画布,但是由于maxiumn画布大小而似乎失败了。有什么方法可以解决code image

解决方法

我会猜一猜,您真正想要的是ScrolledText小部件。试试这个:

import tkinter as tk
from tkinter.scrolledtext import ScrolledText
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg,NavigationToolbar2Tk)
from matplotlib.figure import Figure

root = tk.Tk()
root.geometry('1500x800')
scrollable_frame = ScrolledText(root)
scrollable_frame.pack(expand=True,fill=tk.BOTH)

for i in range(10):
    f = Figure(figsize=(5,5),dpi=100)
    a = f.add_subplot(111)
    a.plot([1,2,3,4,5,6,7,8],[5,1,8,9,5])
    a.set_title("fig" + str(i))
    canvas = FigureCanvasTkAgg(f)
    scrollable_frame.window_create(tk.END,window=canvas.get_tk_widget())
    scrollable_frame.insert(tk.END,'\n')

root.mainloop()

无论在计算机上还是在人类上,无论如何,100张图形都将非常繁重。我认为最好以不同的方式设计程序,以便更新图形而不是滚动浏览许多图形。