gpt4 book ai didi

python - 如何让 FigureCanvasTkAgg 与 Scrollbar 一起工作

转载 作者:行者123 更新时间:2023-12-04 18:02:36 34 4
gpt4 key购买 nike

我想在 tkinter 应用程序中绘图。在最终的节目中,将有许多垂直排列的子情节,超过屏幕。所以我想要一个大小合理的窗口,带有一个滚动条可以向下滚动。

从此处找到的 Canvas 示例开始 Tkinter Scrollbar Patterns我创建了这个我挣扎的最小例子:

#!/usr/bin/python

from Tkinter import Tk, Frame, Canvas, Scrollbar, HORIZONTAL, VERTICAL, BOTH, X, Y, BOTTOM, RIGHT, LEFT, S, N, W, E
from numpy import arange, sin
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

class Test(Tk):
def __init__(self):
Tk.__init__(self, None)
self.frame=Frame(None)
self.frame.columnconfigure(0,weight=1)
self.frame.rowconfigure(0,weight=1)

self.frame.grid(row=0,column=0, sticky=W+E+N+S)

fig = Figure()

xval = arange(200)/10.
yval = sin(xval)

ax1 = fig.add_subplot(111)
ax1.plot(xval, yval)

self.hbar=Scrollbar(self.frame,orient=HORIZONTAL)
self.vbar=Scrollbar(self.frame,orient=VERTICAL)

self.canvas=FigureCanvasTkAgg(fig, master=self.frame)
self.canvas.get_tk_widget().config(bg='#FFFFFF',scrollregion=(0,0,500,500))
self.canvas.get_tk_widget().config(width=300,height=300)
self.canvas.get_tk_widget().config(xscrollcommand=self.hbar.set, yscrollcommand=self.vbar.set)
self.canvas.get_tk_widget().grid(row=0, column=0, sticky=W+E+N+S)

self.hbar.grid(row=1, column=0, sticky=W+E)
self.hbar.config(command=self.canvas.get_tk_widget().xview)
self.vbar.grid(row=0, column=1, sticky=N+S)
self.vbar.config(command=self.canvas.get_tk_widget().yview)

self.frame.config(width=100, height=100) # this has no effect

if __name__ == '__main__':

app = Test()
app.mainloop()

这是我的主要 2 个问题:

  1. 当我调整窗口大小时,滚动条是静态的,即如果我用鼠标拖动减小窗口大小,它会随着绘图的其余部分消失
  2. 更重要的是:如果我在代码中增加 Canvas 大小,窗口大小也会增加。我尝试添加 self.canvas.get_tk_widget().grid_propagate(0) 但没有成功...

一开始我需要窗口大小小于绘图大小。

最佳答案

解决方案:

if __name__ == '__main__':

app = Test()
app.rowconfigure( 0, weight=1 ) # You need to add this.
app.columnconfigure( 0, weight=1 ) # You need to add this.

app.mainloop()

您的 Tk 窗口有一个子 tk.Frame 小部件,即 Tk.frame,位于 Tk 窗口的 (0,0) 网格位置。默认情况下,Tk.frame 的大小将是它的子部件的大小,目前是一个 matplotlib 后端 FigureCanvasTkAgg 对象,它有一个 tk。 Canvas 小部件,即 Tk.frame.canvas.get_tk_widget(),您已将其设置为 300x300 像素宽和高。

您需要这两行来指示 Tk 窗口的网格单元 (0,0) 可拉伸(stretch)。也就是说,单元格 (0,0) 边框应该拉伸(stretch)到“始终触摸 Tk 窗口的边框”。此操作可确保 Tk.frame 的大小始终为 Tk 窗口的大小。

目前,当您在不添加行的情况下调整 Tk 窗口的大小时,您会看到 Tk 窗口的大小调整为 Tk.frame 保持 300x300 像素的宽度和高度不变。

关于python - 如何让 FigureCanvasTkAgg 与 Scrollbar 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32571908/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com