Tkinter FigureCanvasTkAgg 滚动条是功能性的,但子图从滚动视图中被切断
Tkinter FigureCanvasTkAgg scrollbar is functional, but subplots are cut off from scrolling view
我使用 matplotlib 创建了一个包含可变数量子图的图形。我已将滚动条添加到包含此图的页面,以便用户能够滚动浏览各种图。经过多次尝试,滚动条现在可以使用了,但是,该图似乎在页面原始底部的位置被切断,留下一些子图被切断(见图)。
下面的示例代码应该模拟我 运行 遇到的问题。但是,下面的代码似乎有其自身的问题:它不会像在我的原始代码中那样拉伸图形以重现附加的图像。然而,它仍然应该给你一个想法 - 我希望图表能够超过常规帧大小,并且滚动条允许用户查看所有子图。
import tkinter as tk
from tkinter import *
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
f = Figure(figsize = (1,1), dpi = 100)
a = []
for i in range(0,20):
a.append(f.add_subplot(20,1,i+1))
f.set_figheight(60)
f.set_figwidth(14)
for i in range(0,20):
a[i].plot([1,2,3,4,5],[1,2,3,4,5])
a[i].set_title('Graph ' + str(i+1))
class App(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack(side = "top", fill = "both", expand = True)
container.grid_columnconfigure(0,weight=1)
container.grid_rowconfigure(0,weight = 1)
self.minsize(620,400)
self.geometry("{0}x{1}+0+0".format(self.winfo_screenwidth(), self.winfo_screenheight()))
self.update_idletasks()
self.frames = {}
for F in (StartPage, PageTwo):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row = 0, column = 0, sticky = 'nsew')
self.show_frame(StartPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
button_p1 = tk.Button(self, text = "PageTwo →",
command = lambda: controller.show_frame(PageTwo))
button_p1.pack(side = TOP, fill = X)
label = tk.Label(self, text = "Start Page")
label.pack(fill = X, expand = True)
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
button_1 = tk.Button(self, text = "← Start Page",
command = lambda: controller.show_frame(StartPage))
button_1.pack(side = LEFT, anchor = N)
label_p1 = tk.Label(self, text = "PageTwo")
label_p1.pack()
canvas = FigureCanvasTkAgg(f,self)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.BOTTOM,fill=tk.X,expand = True)
scroll=Scrollbar(canvas.get_tk_widget())
scroll.config(command=canvas.get_tk_widget().yview)
scroll.pack(side = RIGHT, fill=Y)
canvas.get_tk_widget().pack(side = LEFT, expand = YES, fill = BOTH)
canvas.get_tk_widget().config(yscrollcommand=scroll.set)
canvas.get_tk_widget().config(scrollregion=(0,0,1000,10000),confine=True)
app = App()
app.mainloop()
过去几天我一直在寻找解决方案,但没有找到专门针对我的问题或我可以更改以适应的解决方案。
Image - Cut off subplots
我认为解决方案应该需要增加框架高度或类似的东西 - 我已经尝试过但没有成功。
我希望所有其他页面保持相同的 window 大小 - 我只想增加 PageTwo 的高度以用于滚动条。
此解决方案可能无法解决滚动所有轴的问题,但我发现了一个可能导致子图被过早切断的错误。我要做的更改是在 Scrollbar 对象的实例化中。传递 canvas 对象而不是小部件解决了我遇到的同样问题。
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
button_1 = tk.Button(self, text = "← Start Page",
command = lambda: controller.show_frame(StartPage))
button_1.pack(side = LEFT, anchor = N)
label_p1 = tk.Label(self, text = "PageTwo")
label_p1.pack()
canvas = FigureCanvasTkAgg(f,self)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.BOTTOM,fill=tk.X,expand = True)
scroll=Scrollbar(canvas)
scroll.config(command=canvas.get_tk_widget().yview)
scroll.pack(side = RIGHT, fill=Y)
canvas.get_tk_widget().pack(side = LEFT, expand = YES, fill = BOTH)
canvas.get_tk_widget().config(yscrollcommand=scroll.set)
canvas.get_tk_widget().config(scrollregion=(0,0,1000,10000),confine=True)
我使用 matplotlib 创建了一个包含可变数量子图的图形。我已将滚动条添加到包含此图的页面,以便用户能够滚动浏览各种图。经过多次尝试,滚动条现在可以使用了,但是,该图似乎在页面原始底部的位置被切断,留下一些子图被切断(见图)。
下面的示例代码应该模拟我 运行 遇到的问题。但是,下面的代码似乎有其自身的问题:它不会像在我的原始代码中那样拉伸图形以重现附加的图像。然而,它仍然应该给你一个想法 - 我希望图表能够超过常规帧大小,并且滚动条允许用户查看所有子图。
import tkinter as tk
from tkinter import *
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
f = Figure(figsize = (1,1), dpi = 100)
a = []
for i in range(0,20):
a.append(f.add_subplot(20,1,i+1))
f.set_figheight(60)
f.set_figwidth(14)
for i in range(0,20):
a[i].plot([1,2,3,4,5],[1,2,3,4,5])
a[i].set_title('Graph ' + str(i+1))
class App(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack(side = "top", fill = "both", expand = True)
container.grid_columnconfigure(0,weight=1)
container.grid_rowconfigure(0,weight = 1)
self.minsize(620,400)
self.geometry("{0}x{1}+0+0".format(self.winfo_screenwidth(), self.winfo_screenheight()))
self.update_idletasks()
self.frames = {}
for F in (StartPage, PageTwo):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row = 0, column = 0, sticky = 'nsew')
self.show_frame(StartPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
button_p1 = tk.Button(self, text = "PageTwo →",
command = lambda: controller.show_frame(PageTwo))
button_p1.pack(side = TOP, fill = X)
label = tk.Label(self, text = "Start Page")
label.pack(fill = X, expand = True)
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
button_1 = tk.Button(self, text = "← Start Page",
command = lambda: controller.show_frame(StartPage))
button_1.pack(side = LEFT, anchor = N)
label_p1 = tk.Label(self, text = "PageTwo")
label_p1.pack()
canvas = FigureCanvasTkAgg(f,self)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.BOTTOM,fill=tk.X,expand = True)
scroll=Scrollbar(canvas.get_tk_widget())
scroll.config(command=canvas.get_tk_widget().yview)
scroll.pack(side = RIGHT, fill=Y)
canvas.get_tk_widget().pack(side = LEFT, expand = YES, fill = BOTH)
canvas.get_tk_widget().config(yscrollcommand=scroll.set)
canvas.get_tk_widget().config(scrollregion=(0,0,1000,10000),confine=True)
app = App()
app.mainloop()
过去几天我一直在寻找解决方案,但没有找到专门针对我的问题或我可以更改以适应的解决方案。
Image - Cut off subplots
我认为解决方案应该需要增加框架高度或类似的东西 - 我已经尝试过但没有成功。
我希望所有其他页面保持相同的 window 大小 - 我只想增加 PageTwo 的高度以用于滚动条。
此解决方案可能无法解决滚动所有轴的问题,但我发现了一个可能导致子图被过早切断的错误。我要做的更改是在 Scrollbar 对象的实例化中。传递 canvas 对象而不是小部件解决了我遇到的同样问题。
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
button_1 = tk.Button(self, text = "← Start Page",
command = lambda: controller.show_frame(StartPage))
button_1.pack(side = LEFT, anchor = N)
label_p1 = tk.Label(self, text = "PageTwo")
label_p1.pack()
canvas = FigureCanvasTkAgg(f,self)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.BOTTOM,fill=tk.X,expand = True)
scroll=Scrollbar(canvas)
scroll.config(command=canvas.get_tk_widget().yview)
scroll.pack(side = RIGHT, fill=Y)
canvas.get_tk_widget().pack(side = LEFT, expand = YES, fill = BOTH)
canvas.get_tk_widget().config(yscrollcommand=scroll.set)
canvas.get_tk_widget().config(scrollregion=(0,0,1000,10000),confine=True)