【问题标题】:Opening a plot in tkinter only (no matplotlib popup)仅在 tkinter 中打开绘图(无 matplotlib 弹出窗口)
【发布时间】:2014-11-08 11:49:22
【问题描述】:

我正在使用以下代码在 tkinter 窗口中打开 matplotlib pyplot。我的问题是该情节仍然在 matplotlib 窗口中弹出,我不知道如何阻止它。我已经尝试注释掉每个 plt.plot,但这没有帮助。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')
from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import Tkinter as Tkinter

def tester():

    class window(Tkinter.Tk):
        def __init__(self,parent):
            Tkinter.Tk.__init__(self,parent)
            self.parent = parent
            self.initialize()

        def initialize(self):
            self.grid()
            self.grid_rowconfigure(0,minsize=50)
            self.grid_rowconfigure(1,minsize=5)
            self.grid_rowconfigure(2,minsize=500)
            self.grid_rowconfigure(3,minsize=5)
            self.grid_rowconfigure(4,minsize=20)

            self.grid_columnconfigure(0,minsize=5)
            self.grid_columnconfigure(1,minsize=800)
            self.grid_columnconfigure(2,minsize=5)

            framer = Tkinter.Frame(self, borderwidth=2, relief='groove',bg='white')
            framer.grid(column=0,row=1,columnspan=3,rowspan=3, sticky='NSEW')
            Button1 = Tkinter.Button(bg='red',text="Click Me",command=self.onbutton1)
            Button1.grid(column=1,row=0,sticky='NSEW')


        def onbutton1(self):
            array = np.array([[1,2,3,2,1],[2,3,4,3,2],[3,4,5,4,3],[4,5,6,5,4],[3,4,5,4,3]])
            maximum = np.max(array)
            index_max = np.where(array == maximum)
            max_a, max_b = index_max  

            plotter=plt.figure('plot')            
            plt.contour(array, linewidths = 1, colors = 'k')
            plt.contourf(array, cmap = plt.cm.jet)
            plt.ylabel('y', fontdict = {'fontsize':16})
            plt.xlabel('x', fontdict = {'fontsize':16})
            plt.colorbar()
            plt.title('Title', fontdict = {'fontsize':20})    
            plt.plot(max_b, max_a, 'wo')
            F_canvas = FigureCanvasTkAgg(plotter, self)
            F_canvas.get_tk_widget().grid(column=1,row=2)


    if __name__ == "__main__":
        app = window(None)
        app.title('Window')
        app.mainloop()

tester()

谁能成为我的英雄?

【问题讨论】:

  • 您可以对数字进行编号——即 plt.figure(1)——然后对其进行处理。在您使用 plt.show(1) 之前,它们不应出现。如果您从不“显示”它,那可能会抑制 matplotlib 窗口。
  • @JKelly 在上面的代码中我根本没有使用 plt.show() 。我是否以不同的方式“展示”它?
  • 好吧,我建议在他们的号码被调用之前给他们编号“持有”他们,但下面 BrenBarn 的建议可能更好。

标签: python python-2.7 matplotlib tkinter


【解决方案1】:

如果你想自己管理所有的窗口,你根本不应该使用 pyplot。例如,当您执行 plt.figure 时,它正在创建一个 matplotlib 管理的图形窗口。

甚至不要导入 pyplot。具体如何调整代码将根据您使用的 matplotlib 功能而有所不同,但是,例如,创建您想要做的图形:

from matplotlib import figure
plotter = figure.Figure()

您将通过访问该图形的 Axes 对象并使用其方法(例如,如果您有一个坐标区 ax,您可以调用 ax.contour)来访问大多数绘图类型(例如 contour)。

有关如何将 matplotlib 嵌入 Tkinter 应用程序的简单演示,请参阅 this example

【讨论】:

  • 感谢您的回复。我是这方面的初学者......制作斧头的语法是什么?
  • @JohnCrow:我认为你可以通过ax = plotter.gca() 来获得该图的 Axes。
猜你喜欢
  • 2019-07-28
  • 2012-09-03
  • 2012-01-02
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多