在tkinter Toplevel中调整matplotlib图的大小

时间:2015-04-03 13:00:37

标签: python matplotlib tkinter

我有一些代码可以在tkinter toplevel小部件中打开一个图。当我抓住顶层的角落来调整它的大小时,我希望该绘图可以随窗口一起调整大小。

import Tkinter
import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.backends.backend_tkagg import NavigationToolbar2TkAgg
from matplotlib.figure import Figure

class grapher_gui(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.graph()

    def graph(self):
        x_vals = [0,3,10,15]
        y_vals = [232,120,45,23]

        toplevel = Tkinter.Toplevel(width=2000)
        figure = Figure(figsize=(10,5))
        ax = figure.add_subplot(111)
        plot = ax.plot(x_vals, y_vals, 'k-')
        ax.set_xlabel('Time')
        ax.set_ylabel('Numbers')
        ax.set_title('Title')

        canvas = FigureCanvasTkAgg(figure, master=toplevel)
        canvas.show()
        canvas.get_tk_widget().grid(row=0)            
        toolbar = NavigationToolbar2TkAgg(canvas, toplevel)
        toolbar.grid(row=1, sticky=Tkinter.W) 
        toolbar.update() 
        toplevel.mainloop()

if __name__ == "__main__":
    app = grapher_gui(None)
    app.title('Grapher')
    app.mainloop()

我唯一能想到的就是将sticky='NSEW'添加到canvas.get_tk_widget().grid(row=0),但这不起作用。

2 个答案:

答案 0 :(得分:1)

你必须bind an event to the window resize - 换句话说,不是让程序注意鼠标点击之类的事情并在事情发生时做某事,让程序监视窗口的大小调整并在发生这种情况时执行某些操作

graph()中,添加:

self.toplevel.bind("<Configure>", resize)

然后创建变量实例变量(例如self.toplevel而不是toplevel),以便您可以从其他方法中引用它们。

然后添加一个实例方法def resize(event):,它可以执行任何操作,以重新绘制具有新大小的绘图。您可以通过访问Topleveltoplevel.winfo_height()来增加toplevel.winfo_width()窗口维度的大小(如果您已经设置了实例变量,则添加self )。

调整Toplevel窗口的大小时,该事件将被&#34;看到&#34;并路由到给定的回调(绑定到该事件的方法)。

这是一个小例子,可以在您调整大小时打印root窗口的大小:

>>> import tkinter as tk
>>> root = tk.Tk()
>>> def onsize(event):
...     print(root.winfo_width(), root.winfo_height())
...
>>> root.bind("<Configure>", onsize)

顺便提一下,you only need to call mainloop() once位于main区域。不要为每个Toplevel窗口调用它。

答案 1 :(得分:1)

尝试将packexpand=True一起使用,而不是gridsticky一起使用。这个简化的示例适用于我,图表使用窗口调整大小:

import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure

import Tkinter as tk
import ttk

class My_GUI:

    def __init__(self,master):
        self.master=master
        master.title("Dashboard")
        f = Figure(figsize=(5,5), dpi=100)
        a = f.add_subplot(111)
        a.scatter([1,2,3,4,5,6,7,8],[5,6,1,3,8,9,3,5])
        canvas1=FigureCanvasTkAgg(f,master)
        canvas1.show()
        canvas1.get_tk_widget().pack(side="top",fill='both',expand=True)
        canvas1.pack(side="top",fill='both',expand=True)

root=tk.Tk()
gui=My_GUI(root)
root.mainloop()

我知道这可能很难取决于使用pack重新设计你的gui的距离......但是可能值得而不是制作一个自定义的resize事件处理程序。我很同情,如果网格和粘性适用于图表会很好:/