【问题标题】:Resizing a matplotlib plot in a tkinter Toplevel在 tkinter Toplevel 中调整 matplotlib 图的大小
【发布时间】:2015-06-08 13:44:51
【问题描述】:

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

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),但这不起作用。

【问题讨论】:

    标签: python matplotlib tkinter


    【解决方案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()
    

    我知道这可能会很困难,具体取决于您的 gui 使用 pack 重新设计多远...但可能值得而不是制作自定义的调整大小事件处理程序。不过我很同情,如果网格和粘性适用于图表,那就太好了:/

    【讨论】:

      【解决方案2】:

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

      graph() 中,添加:

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

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

      然后添加一个实例方法def resize(event):,它会执行您需要做的任何事情来用新的大小重新绘制绘图。您可以通过访问toplevel.winfo_height()toplevel.winfo_width()(添加self,如果您已将其设为实例变量)来确定Toplevel 窗口尺寸的大小。

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

      这是一个小例子,当您调整 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 窗口调用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-06
        • 2021-05-07
        • 2021-04-21
        • 2011-05-03
        • 2012-10-23
        • 2010-11-19
        • 2016-01-25
        • 1970-01-01
        相关资源
        最近更新 更多