簡體   English   中英

Python Tkinter 在 GUI 中嵌入 Matplotlib

[英]Python Tkinter Embed Matplotlib in GUI

我試圖在我用 Python 編碼的 Tkinter GUI 中嵌入一個繪圖。 我相信下面的代碼可以成功地將圖形簡單地放入畫布中,但我無法控制 GUI 網格中的畫布位置。 我希望能夠將我的 GUI 的一部分作為情節......而不是全部。 如何定位此畫布小部件?

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

您沒有任何其他小部件,因此很難知道您想要其他小部件的位置。 不過,這是我可以告訴您的:通過執行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繪圖的代碼之后,工具欄會顯示在底部! 那是因為TOPBOTTOM等指的是任何其他已經pack小部件留下的空間。 情節占據頂部,剩下的空間在底部。 因此,當您再次指定TOP時,它的意思是“在已經位於頂部的區域下方的頂部”。

所以,你有一些選擇。 最好的選擇是按照您希望它們出現的順序制作小部件。 如果在pack繪圖之前將工具欄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 意味着前者將擴展為后者的兩倍。

有關更多信息,請參閱網格上的此頁面和包裝上的此頁面

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM