不能在没有崩溃的情况下在tkinter GUI中绘制matplotlib图表

时间:2016-04-29 02:01:36

标签: user-interface matplotlib tkinter tkinter-canvas

我目前正在通过教程关注此链接: Here is the one I am following。老兄给你代码。无论如何都把它包括在底部。

肯定会推荐。但现在面临问题:

  • 使用Spyder 2.3.8
  • Python 3.5
  • 一切都是最新的
  • 为Spyder设置了后端,将matplotlib读作'TkAgg'(也花了很多年!)。

已经勾选出引起问题的三条线路。当这些行不活动时工作正常。激活它们并运行会导致我的终端崩溃并收到消息:

  

内核似乎意外死亡。使用“重新启动内核”继续使用此控制台。

我真的一直在寻找解决方案。目标是将图表放入Tkinter GUI而不会崩溃。请帮忙!?

以下是代码,几乎与链接中提供的代码相同:

import matplotlib
#matplotlib.use("TkAgg")

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,NavigationToolbar2TkAgg
from matplotlib.figure import Figure

import tkinter as tk
import pandas as pd
from tkinter import ttk


LARGE_FONT=("Consolas",12)

class SeaofBTCapp(tk.Tk):

    def __init__(self,*args,**kwargs):
        #
        #tk.Tk.wm_title(self,"")

    print("")
    tk.Tk.__init__(self,*args,**kwargs)
    tk.Tk.wm_title(self,"Hold my Hand")
    tk.Tk.iconbitmap(self,default="1.ico")
    container=tk.Frame(self)
    container.pack(side="top", fill="both",expand=True)
    container.grid_rowconfigure(0,weight=1)
    container.grid_columnconfigure(0,weight=1)
    self.frames={}
    for F in (StartPage,PageThree):
        frame=F(container, self)

        self.frames[F]=frame
        frame.grid(row=0,column=0,sticky="nsew") #north south east west

    self.show_frame(StartPage)

def show_frame(self, cont):
    frame = self.frames[cont]
    frame.tkraise()

def qf(stringtoprint):
    print(stringtoprint)

class StartPage(tk.Frame):
    def __init__(self,parent,controller):
        ttk.Frame.__init__(self,parent)
        label=ttk.Label(self,text="Testing",font=LARGE_FONT)
        label.pack(pady=10,padx=10)

        button3=ttk.Button(self, text="Graph page",
                          command=lambda:controller.show_frame(PageThree))
                          #lambda:controller.show_frame(PageOne))
        button3.pack()

class PageThree(tk.Frame):
    def __init__(self, parent, controller):    
       # app=tk.Tk()
        tk.Frame.__init__(self,parent)
        label=tk.Label(self,text="Graph Page",font=LARGE_FONT)
        label.pack(pady=10,padx=10)

        label1=ttk.Button(self, text="Start Page",
                   command=lambda:controller.show_frame(StartPage))
        label1.pack()

        label1=ttk.Button(self, text="Back to Home",
                   command=lambda:controller.show_frame(StartPage))
        label1.pack()

    #    f=Figure(figsize=(5,5))
    #    a=f.add_subplot(111)
    #    a.plot([1,2,3,4,5,6,7,8],[5,6,7,8,1,2,2,1])
     #   canvas=FigureCanvasTkAgg(f,self)
     #   canvas.show()
     #   canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH,expand=True)

app=SeaofBTCapp()
app.mainloop()

以上三六线导致Spyder崩溃。

2 个答案:

答案 0 :(得分:1)

卸载conda版本并通过pip安装它会修复它。

有一个问题:https://github.com/ContinuumIO/anaconda-issues/issues/979

答案 1 :(得分:0)

我在几天内遇到了同样的问题(Python 3.5.2 / 64-bit,matplotlib 1.5.1,Win 10 Professional)。重新安装matplotlib,tkinter和Python并没有帮助。 Anaconda中的Tkinter + matplotlib也不起作用。由于我不够精通从源代码构建matplotlib,我刚刚安装了Ubuntu + Anaconda,它帮助解决了这个问题。

您发布的代码(即缩进等)有问题,我没有尝试修复它。但是下面的代码正在使用Ubuntu:

   import matplotlib
   from matplotlib.figure import Figure
   from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
   import tkinter as tk

   fig = Figure()
   plt = fig.add_subplot(111)
   plt.plot([1, 2], [1, 2])

   root = tk.Tk()
   canvas = FigureCanvasTkAgg(fig, master=root)
   canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
   root.update()
   root.mainloop()

我希望,它有所帮助。