2016-04-29 99 views
0

我目前正在使用教程跟随此链接: Here is the one I am following。伙计给你的代码。无论如何,它已经包括在底部。无法在tkinter GUI中绘制matplotlib图表而不会崩溃

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

  • 使用Spyder的2.3.8
  • 的Python 3.5
  • 一切最新
  • 已经为Spyder的后端为 'TkAgg' 读matplotlib(也花了很长时间!) 。

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

看起来内核意外死亡。使用'重新启动内核'继续使用这个控制台。

我真的一直在寻找解决方案。目标是让图表进入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的崩溃。

+0

这里有太多的代码。你能减少到10-15线的例子吗? – tacaswell

+0

@Panik您可以检查matplotlib的例子,例如http://matplotlib.org/examples/user_interfaces/embedding_in_tk.html确保它们适合你? – mfitzp

+0

@tcaswell将更新代码并将其缩小,无法将其作为15行的小示例,但会尽可能小。 – Panik

回答

0

我一直在挣扎几天(Python 3.5.2/64位,matplotlib 1.5.1,Win 10专业版)。重新安装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() 

我希望它有帮助。