【问题标题】:cannot draw matplotlib chart in tkinter GUI without crashing无法在 tkinter GUI 中绘制 matplotlib 图表而不会崩溃
【发布时间】:2016-08-24 00:35:32
【问题描述】:

我目前正在关注此链接的教程: 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崩溃。

【问题讨论】:

  • 这里的代码太多了。你能把它减少到一个 10-15 行的例子吗?
  • @Panik 你能检查 matplotlib 的例子吗? matplotlib.org/examples/user_interfaces/embedding_in_tk.html 以确保它们为您工作?
  • @tcaswell 将更新代码并将其缩小,不能将其作为一个 15 行的小示例,但会尽可能小!
  • @mfitzp 也非常感谢,去过几次.. 但是,如果我复制您链接的代码,逐行复制...我得到完全相同的错误.. 没有 GUI 只是内核死了!似乎错误在于尝试通过 tkinter 画布“显示”图表时..让我发疯
  • @Panik 这就是我问的原因。我可以用你的代码重现错误,但是当我尝试演示代码时它也崩溃了,这表明我们的安装有问题。

标签: user-interface matplotlib tkinter tkinter-canvas


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我在同一问题上苦苦挣扎了几天(Python 3.5.2/64 位、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()
    

    我希望,它有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-12-18
      • 1970-01-01
      • 2020-12-25
      • 2023-01-31
      • 2020-10-09
      • 2017-08-21
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      相关资源
      最近更新 更多