2010-11-01 443 views
15

我試圖在Python中編寫的Tkinter GUI中嵌入一個圖。我相信下面的代碼能夠簡單地將圖形放入畫布中,但我沒有任何GUI網格內畫布位置的控制權。我希望能夠讓我的GUI的一個小部分成爲劇情......而不是整個劇情。我怎樣才能定位這個畫布小部件?Python Tkinter在GUI中嵌入Matplotlib

#!/usr/apps/Python/bin/python 
import matplotlib, sys 
matplotlib.use('TkAgg') 
from numpy import arange, sin, pi 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
from matplotlib.figure import Figure 
from Tkinter import * 

master = Tk() 
master.title("Hello World!") 
#------------------------------------------------------------------------------- 

f = Figure(figsize=(5,4), dpi=100) 
a = f.add_subplot(111) 
t = arange(0.0,3.0,0.01) 
s = sin(2*pi*t) 
a.plot(t,s) 


dataPlot = FigureCanvasTkAgg(f, master=master) 
dataPlot.show() 
dataPlot.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1) 
#------------------------------------------------------------------------------- 
master.mainloop() 
+2

在一個不完全不相關的筆記上,你的帖子對我來說是非常有用的,使我的程序在學習如何應用'matplotlib.figure.Figure'工作。謝謝。 – deadstump 2012-10-02 14:44:09

回答

21

您沒有任何其他小部件,因此很難知道您想要其他小部件的位置。下面是我可以告訴你的事情:通過做dataPlot.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)你要求Tkinter填滿屏幕。這是因爲您要求它填寫所有方向(fill=BOTH)並展開以填充任何額外空間(expand=1)。

但是,您仍然可以添加其他小部件。 pack通過將小部件放置在容器的一側來工作。您的貨櫃,master,總是有四面。因此,舉例來說,如果你想創建一個工具欄,你會做這樣的事情:

toolbar = tk.Frame(master) 
button = tk.Button(toolbar, text="Push me") 
button.pack(side="left") # left side of parent, the toolbar frame 
toolbar.pack(side=TOP, fill="x") # top of parent, the master window 

請注意,如果你把這個代碼後的代碼,你pack劇情,工具欄顯示了在底部!這是因爲TOP,BOTTOM等指的是已經被pack編輯的任何其他小部件遺留的空間。情節佔據頂部,剩下的空間在底部。因此,當您再次指定TOP時,它意味着「位於頂部已經位於頂部的區域的頂部」。

所以,你有一些選擇。最好的選擇是按照您希望顯示的順序製作小部件。如果你在pack之前的頂部的工具欄的陰謀,它將是最上面顯示的工具欄。此外,您可以將情節放在底部而不是頂部,這也可以解決問題。順便說一下,我通常在一個塊中創建我的小部件,然後將它們放在一個單獨的塊中。我發現它使代碼更容易維護。

可能更適合您的心理模型的另一種選擇是grid而不是pack。用grid您可以選擇小部件佔用的行和列。這使得把事情放在網格中變得很容易,但代價是需要使用更多的代碼。

例如,把頂部的工具欄和小區樓下,你可以做:

toolbar.grid(row=1, column=1, sticky="ew") 
dataPlot.get_tk_widget().grid(row=1, column=1, sticky="nsew") 
master.grid_rowconfigure(0, weight=0) 
master.grid_rowconfigure(1, weight=1) 
master.grid_columnconfigure(0, weight=1) 

注意,行和列從零開始。此外,「重量」指的是這個小部件相對於其他小部件的擴展程度。在兩列重量相同的情況下,當窗口大小調整時,它們將平均展開。零的權重意味着沒有擴展。一列爲2,另一列爲1意味着前者將擴大兩倍。

欲瞭解更多信息,請參閱this page on gridthis page on pack