2015-04-03 217 views
1

我有一些代碼在tkinter頂層小部件中打開一個圖。當我抓住頂層的角落來調整它的大小時,我希望劇情隨着窗口一起調整大小。在tkinter Toplevel中調整matplotlib圖的大小

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),但不工作的唯一的事。

回答

1

您必須bind an event to the window resize - 換句話說,而不是讓程序監視類似於鼠標點擊的東西,並在發生時執行某些操作,讓程序監視正在調整窗口的大小,並在發生這種情況時執行某些操作。

graph(),添加:

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

然後使變量實例變量(例如的替代self.topleveltoplevel),這樣你可以參考其他方法給他們。

然後添加一個實例方法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窗口調用它。

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使用包裝重新設計可能很難......但可能是值得的,而不是製作的自定義調整事件處理程序。雖然我很同情,但如果grid和sticky爲圖表工作,那會很棒:/

相關問題