在Python中的Tkinter主窗口上放置绘图

在Python中的Tkinter主窗口上放置绘图,python,canvas,matplotlib,plot,tkinter,Python,Canvas,Matplotlib,Plot,Tkinter,我有一个程序处理数据,然后绘制结果。通常在Python中,绘图显示在新窗口中,但我想在同一Tkinter窗口中显示绘图。我已经搜索并找到了这两个答案。他们说,我们应该首先制作画布,然后使用网格或包将其放置在窗口上。这是我第一次使用canvas,我已经应用了这个概念,下面是一个工作示例代码 from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg __author__ = 'Dania' import numpy as np

我有一个程序处理数据,然后绘制结果。通常在Python中,绘图显示在新窗口中,但我想在同一Tkinter窗口中显示绘图。我已经搜索并找到了这两个答案。他们说,我们应该首先制作画布,然后使用网格或包将其放置在窗口上。这是我第一次使用canvas,我已经应用了这个概念,下面是一个工作示例代码

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()
上面的代码首先在单独的窗口中显示绘图,然后在网格中指定的位置显示没有绘图的灰色画布。此外,画布垂直展开,窗口的一部分消失,换句话说,画布向下推动其下方的内容,它们不再显示,因为没有出现垂直滚动条

我希望在同一Tkinter窗口中显示绘图,如果有任何内容被按下,我希望能够滚动窗口。

主要更改:

  • 使用matplolib.figure而不是matplotlib.pyplot(并重命名所有相关函数)
  • 添加self.window变量
  • 到处使用pack()(不能在一个容器中混合使用网格和包。)
  • 结果:

    __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()
    

    请发布一个完整的最小示例。谢谢Eric,我已经更新了问题并发布了工作代码,你能检查一下吗?谢谢,非常感谢Eric,这很好用。有两行我不清楚,你能告诉我这两行是什么意思吗,fig=Figure(figsize=(6,6))和a=fig.add_子图(111)?谢谢。我从他们制作人物开始,然后是一个子人物,然后将人物添加到画布上。希望这能有所帮助。嘿,我知道我已经晚了很多年才开始这段对话,但是如果我想用命令清除情节,我该怎么做呢?我正在尝试制作一个交互式散点图(带有一些点击事件),但它不适用于Figure:(