在Python Tkinter中嵌入Matplotlib到GUI

19 投票
1 回答
31338 浏览
提问于 2025-04-16 06:24

我正在尝试在用Python编写的Tkinter图形界面中嵌入一个图表。我觉得下面的代码可以把图表放到一个画布上,但我无法控制这个画布在图形界面网格中的位置。我想让图表只占据图形界面的一部分,而不是整个界面。我该如何调整这个画布的位置呢?

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

1 个回答

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

注意,如果你把这段代码放在你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,意味着前者的扩展量是后者的两倍。

想了解更多信息,可以查看这篇关于grid的页面,以及这篇关于pack的页面

撰写回答