在 Python 中的 Tkinter 主窗口上放置绘图
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/31440167/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Placing plot on Tkinter main window in Python
提问by Dania
I have a program that processes data then plots the result. Usually in Python plots are shown in a new window, but I want to show the plot in the same Tkinter window. I've searched and found these two answers, Python Tkinter Embed Matplotlib in GUI, and How do I refresh a matplotlib plot in a Tkinter window?. They state that we should first make a canvas then place it on the window using grid or pack. This is the first time I use canvas, I've applied the concept, and here is a working sample code for that,
我有一个处理数据然后绘制结果的程序。通常在 Python 中,绘图显示在新窗口中,但我想在同一个 Tkinter 窗口中显示绘图。我搜索并找到了这两个答案,Python Tkinter Embed Matplotlib in GUI和How do I refresh a matplotlib plot in a Tkinter window?. 他们说我们应该首先制作一个画布,然后使用网格或包将其放置在窗口上。这是我第一次使用画布,我已经应用了这个概念,这里有一个工作示例代码,
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
__author__ = 'Dania'
import numpy as np
from Tkinter import *
import matplotlib.pyplot as plt
class mclass:
def __init__(self, window):
self.box = Entry(window)
self.button = Button (window, text="check", command=self.plot)
self.box.pack ()
self.button.pack()
def plot (self):
x=np.array ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
v= np.array ([16,16.31925,17.6394,16.003,17.2861,17.3131,19.1259,18.9694,22.0003,22.81226])
p= np.array ([16.23697, 17.31653, 17.22094, 17.68631, 17.73641 , 18.6368,
19.32125, 19.31756 , 21.20247 , 22.41444 , 22.11718 , 22.12453])
plt.scatter(v,x,color='red')
plt.plot(p, range(2 +max(x)),color='blue')
plt.gca().invert_yaxis()
plt.suptitle ("Estimation Grid", fontsize=16)
plt.ylabel("Y", fontsize=14)
plt.xlabel("X", fontsize=14)
plt.show()
plt.gcf().canvas.draw()
fig = plt.figure()
canvas = FigureCanvasTkAgg(fig, master=window)
canvas.get_tk_widget().grid(row=1,column=24)
canvas.draw()
window= Tk()
start= mclass (window)
window.mainloop()
The code above first shows the plot in a separated window, then shows a gray canvas without a plot in the position specified in grid. Also, the canvas expands vertically and a part of the window disappears, in other words the canvas pushes the contents bellow it down, and they don't appear anymore as no vertical scrolling bar appear.
上面的代码首先在单独的窗口中显示绘图,然后在 grid 中指定的位置显示一个没有绘图的灰色画布。此外,画布垂直扩展并且窗口的一部分消失,换句话说,画布将其下方的内容向下推,并且它们不再出现,因为没有出现垂直滚动条。
I want to show the plot in the same Tkinter window, and if any content is pushed down I want to be able to scroll the window.
我想在同一个 Tkinter 窗口中显示绘图,如果有任何内容被按下,我希望能够滚动窗口。
采纳答案by Eric Levieil
Main changes:
主要变化:
- Using matplolib.figure instead of matplotlib.pyplot (and renaming all related functions)
- Adding a self.window variable
- Using pack() everywhere (you cannot mix grid and pack in one container.)
- 使用 matplolib.figure 而不是 matplotlib.pyplot (并重命名所有相关函数)
- 添加一个 self.window 变量
- 在任何地方使用 pack() (您不能将 grid 和 pack 混合在一个容器中。)
Result:
结果:
__author__ = 'Dania'
import matplotlib
matplotlib.use('TkAgg')
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from Tkinter import *
class mclass:
def __init__(self, window):
self.window = window
self.box = Entry(window)
self.button = Button (window, text="check", command=self.plot)
self.box.pack ()
self.button.pack()
def plot (self):
x=np.array ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
v= np.array ([16,16.31925,17.6394,16.003,17.2861,17.3131,19.1259,18.9694,22.0003,22.81226])
p= np.array ([16.23697, 17.31653, 17.22094, 17.68631, 17.73641 , 18.6368,
19.32125, 19.31756 , 21.20247 , 22.41444 , 22.11718 , 22.12453])
fig = Figure(figsize=(6,6))
a = fig.add_subplot(111)
a.scatter(v,x,color='red')
a.plot(p, range(2 +max(x)),color='blue')
a.invert_yaxis()
a.set_title ("Estimation Grid", fontsize=16)
a.set_ylabel("Y", fontsize=14)
a.set_xlabel("X", fontsize=14)
canvas = FigureCanvasTkAgg(fig, master=self.window)
canvas.get_tk_widget().pack()
canvas.draw()
window= Tk()
start= mclass (window)
window.mainloop()