2016-04-29 82 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() 

我希望它有幫助。