[英]Adding a scrollbar to a canvas with figures tkinter
我正在尝试将滚动条添加到 canvas 以查看否则将不适合屏幕的图形集合,或者在所述 canvas 中分配的空间。
我找到了有关如何使用标签和按钮执行此操作的信息,并且能够重现该操作。 但是,对于数字,这似乎不起作用。
下面我粘贴我正在处理的示例的代码。 它绘制了一个带有 2 个堆叠子图的大图。 滚动条未激活。
有人可以帮我吗
import tkinter as tk
from tkinter import ttk
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
class Example(tk.Tk):
def __init__(self,*args,**kwargs):
tk.Tk.__init__(self,*args,**kwargs)
tk.Button(self,bg='red',text="one").grid(row=0,column=0,sticky='we', padx=5, pady=10)
tk.Button(self,bg='blue',text="two").grid(row=1,column=0,ipadx=200,sticky='we', padx=5, pady=5)
tk.Label(self,bg='green',text="label").grid(row=2,column=0,sticky='we',padx=5, pady=5)
first_frame= tk.Frame(self, pady=5, padx=5)
first_frame.grid(row=3,column=0)
canvas=tk.Canvas(first_frame,bg="orange",height=300,width=480)
canvas.pack(side="bottom", fill="both", expand=True)
scrollbar = ttk.Scrollbar(canvas, orient="vertical", command=canvas.yview)
scrollbar.pack(side="right", fill="y")
canvas.configure(yscrollcommand=scrollbar.set)
scrollbar.bind("<Configure>",lambda e: canvas.configure(scrollregion=canvas.bbox("all")))
second_frame=tk.Canvas(canvas)
canvas.create_window((0, 0), window=second_frame, anchor="ne")
# Random data
np.random.seed(3)
x = 0.5 + np.arange(8)
y = np.random.uniform(2, 7, len(x))
# Plot 2 stacked figures
fig, ax1= plt.subplots(2,figsize=(5,50))
ax1[0].step(x, y, linewidth=2.5)
ax1[0].set(xlim=(0, 8), xticks=np.arange(1, 8),
ylim=(0, 8), yticks=np.arange(1, 8))
ax1[1].step(x, y, linewidth=2.5)
ax1[1].set(xlim=(0, 8), xticks=np.arange(1, 8),
ylim=(0, 8), yticks=np.arange(1, 8))
# Draw into canvas
canvas_fig = FigureCanvasTkAgg(fig,canvas)
canvas_fig.get_tk_widget().pack(side="bottom", fill="y")
scrollbar.config(command=canvas_fig.get_tk_widget().yview)
app=Example()
app.geometry("480x320")
app.title("Scrollfigure")
app.mainloop()
您的代码中存在问题:
scrollbar
应该是first_frame
的子级而不是canvas
canvas
需要包装在left
而不是bottom
<Configure>
事件应该绑定在second_frame
而不是scrollbar
上anchor="nw"
而不是canvas.create_window(...)
中的anchor="ne"
canvas_fig
应该是second_frame
的子代,而不是canvas
scrollbar.config(command=canvas_fig.get_tk_widget().yview)
不应执行以下是更新后的代码:
import tkinter as tk
from tkinter import ttk
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
class Example(tk.Tk):
def __init__(self,*args,**kwargs):
tk.Tk.__init__(self,*args,**kwargs)
tk.Button(self,bg='red',text="one").grid(row=0,column=0,sticky='we', padx=5, pady=10)
tk.Button(self,bg='blue',text="two").grid(row=1,column=0,ipadx=200,sticky='we', padx=5, pady=5)
tk.Label(self,bg='green',text="label").grid(row=2,column=0,sticky='we',padx=5, pady=5)
first_frame= tk.Frame(self, pady=5, padx=5)
first_frame.grid(row=3,column=0)
canvas=tk.Canvas(first_frame,bg="orange",height=300,width=480)
canvas.pack(side="left", fill="both", expand=True) ### side="left" instead of "bottom"
scrollbar = ttk.Scrollbar(first_frame, orient="vertical", command=canvas.yview) # child of first_frame instead of canvas
scrollbar.pack(side="right", fill="y")
canvas.configure(yscrollcommand=scrollbar.set)
#scrollbar.bind("<Configure>",lambda e: canvas.configure(scrollregion=canvas.bbox("all")))
second_frame=tk.Canvas(canvas)
# bind on second_frame instead of scrollbar
second_frame.bind("<Configure>",lambda e: canvas.configure(scrollregion=canvas.bbox("all")))
canvas.create_window((0, 0), window=second_frame, anchor="nw") ### anchor="nw" instead of "ne"
# Random data
np.random.seed(3)
x = 0.5 + np.arange(8)
y = np.random.uniform(2, 7, len(x))
# Plot 2 stacked figures
fig, ax1= plt.subplots(2,figsize=(5,50))
ax1[0].step(x, y, linewidth=2.5)
ax1[0].set(xlim=(0, 8), xticks=np.arange(1, 8),
ylim=(0, 8), yticks=np.arange(1, 8))
ax1[1].step(x, y, linewidth=2.5)
ax1[1].set(xlim=(0, 8), xticks=np.arange(1, 8),
ylim=(0, 8), yticks=np.arange(1, 8))
# Draw into canvas
canvas_fig = FigureCanvasTkAgg(fig, second_frame) # used second_frame instead of canvas
canvas_fig.get_tk_widget().pack(side="bottom", fill="y")
#scrollbar.config(command=canvas_fig.get_tk_widget().yview)
app=Example()
#app.geometry("480x320")
app.title("Scrollfigure")
app.mainloop()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.