【问题标题】:How to get FigureCanvasTkAgg to work with Scrollbar如何让 FigureCanvasTkAgg 与 Scrollbar 一起使用
【发布时间】:2015-12-10 20:58:59
【问题描述】:

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

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

#!/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()

这是我的两个主要问题:

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

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

【问题讨论】:

    标签: python matplotlib tkinter


    【解决方案1】:

    解决方案:

    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) 是可拉伸的。也就是说,单元格 (0,0) 边框应该延伸到“始终触摸Tk 窗口的边框”。此操作可确保Tk.frame 的大小始终是Tk 窗口的大小。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-25
      • 2018-07-10
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      相关资源
      最近更新 更多