Python Tkinter在GUI中嵌入Matplotlib

the*_*ame 19 python grid canvas tkinter matplotlib

我正在尝试在用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()
Run Code Online (Sandbox Code Playgroud)

Bry*_*ley 23

您没有任何其他小部件,因此很难知道您想要其他小部件的位置.以下是我可以告诉你的内容:通过这样做,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
Run Code Online (Sandbox Code Playgroud)

请注意,如果您将此代码放在绘图所在的代码之后pack,则工具栏会显示在底部!这是因为TOP,BOTTOM等等,是指已被pack编辑的任何其他小部件遗留下来的空间.情节占据了顶部,剩下的空间位于底部.因此,当您TOP再次指定时,它意味着"位于下方区域顶部的任何位置".

所以,你有一些选择.最好的选择是按照希望它们出现的顺序制作小部件.如果您packpack绘图之前位于顶部的工具栏,则它将显示在最顶部的工具栏中.此外,您可以将绘图放在底部而不是顶部,这也将解决问题.

顺便说一句,我通常在一个块中创建我的小部件,然后将它们全部放在一个单独的块中.我发现它使代码更容易维护.

另一种可能更适合你的心理模型的选择是grid 代替 pack.有了grid你可以选择行(S)和小部件占据列(S).这使得在网格中放置内容变得容易,但代价是不得不使用更多的代码.

例如,要将工具栏放在顶部,将图表放在下面,您可以执行以下操作:

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)
Run Code Online (Sandbox Code Playgroud)

请注意,行和列从零开始.此外,"权重"是指此窗口小部件相对于其他窗口小部件的扩展程度.对于两行相同的权重,当窗口调整大小时,它们将相等地扩展.权重为零意味着没有扩展.一行的权重为2,另一行的权重为1意味着前者将扩展为后者的两倍.

欲了解更多信息,请参阅此页面上的网格,并在包装这个页面.