【问题标题】:tkinter and matplotlib canvas shows, but not navigation toolbar and graph titletkinter 和 matplotlib 画布显示,但不显示导航工具栏和图形标题
【发布时间】:2015-11-06 23:38:06
【问题描述】:

我正在创建一个将 matplotlib 合并到 tkinter 中的程序。该程序的大部分工作包括显示图形的画布,但是,图形标题、导航工具栏和 xy 图例不显示。我想知道的代码部分就在脚本的底部:

toolbar = NavigationToolbar2TkAgg( canvas, root ) 
toolbar.update() 
canvas._tkcanvas.grid(row=9,column=0)
plt.xlabel('x label')
plt.ylabel('y label')
plt.title('Graph')
plt.show()

有人有什么建议吗?任何帮助将不胜感激!

from matplotlib import pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
from tkinter import *
import tkinter as Tk
import numpy as np
import math
import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backend_bases import key_press_handler
import sys


root = Tk.Tk()

#Interface-----------------------------------------------------------

title_label = Button(root,text = "Add graph title", padx=2,pady=2)
xlabel = Button(root,text =      "Add X values    ", padx=2,pady=2)
ylabel = Button(root,text =      "Add Y values    ", padx=2,pady=2)
nameXaxis = Button(root,text =   "Name X axis      ", padx=2,pady=2)
nameYaxis = Button(root,text =   "Name Y axis      ", padx=2,pady=2)
meanLabel = Button(root,text = "Mean          ")
stderrorLabel = Button(root,text = "StdError:     ")

barGraph = Button(root,text = "Bar Graph  ",fg = "red", padx=2,pady=2)
lineGraph = Button(root,text = "Line Graph", fg = "red",padx=2,pady=2)
pieGraph = Button(root,text = "Pie Graph  ",fg = "red",padx=2,pady=2)

titleEntry = Entry(root)
xentry = Entry(root)
yentry = Entry(root)
nameXaxisEntry = Entry(root)
nameYaxisEntry = Entry(root)
meanText = Text(root,height=1,width=4)
stderrText = Text(root,height=1,width=4)        


title_label.grid(row = 0, column = 0,sticky = E)
xlabel.grid(row = 1, column = 0, sticky = E)
ylabel.grid(row = 2, column = 0, sticky = E)
nameXaxis.grid(row = 3, column = 0, sticky = E)
nameYaxis.grid(row = 4, column = 0, sticky = E)

barGraph.grid(row = 0,column = 1,ipadx=10,sticky=W)
lineGraph.grid(row = 1,column = 1,ipadx=10,sticky=W)
pieGraph.grid(row = 2,column = 1,ipadx=10,sticky=W)

meanLabel.grid(row = 3,column = 1,ipadx=10,sticky=W)
stderrorLabel.grid(row = 4,column = 1,ipadx=10,sticky=W)                      


titleEntry.grid(row = 0, column = 0,ipadx=100,sticky=W)
xentry.grid(row = 1, column = 0,ipadx=100,sticky=W)
yentry.grid(row = 2, column = 0,ipadx=100,sticky=W)
nameXaxisEntry.grid(row = 3, column = 0,ipadx=100,sticky=W)
nameYaxisEntry.grid(row = 4, column = 0,ipadx=100,sticky=W)
meanText.grid(row=3,column=3,sticky=W)
stderrText.grid(row=4,column=3,sticky=W)

# Adding line graph to Canvas--------------------------------------------


root.title("Naynts Graphs") 

fig = Figure(figsize=(5,4), dpi=100) 
ax = fig.add_subplot(111) 

canvas = FigureCanvasTkAgg(fig,root) 
canvas.show() 
canvas.get_tk_widget().grid(row=7,column=0) 

toolbar = NavigationToolbar2TkAgg( canvas, root ) 
toolbar.update() 
canvas._tkcanvas.grid(row=9,column=0)

# Adding features to graph

plt.xlabel('x label')
plt.ylabel('y label')
plt.title('Graph')
plt.show()


root.mainloop()

【问题讨论】:

    标签: python matplotlib tkinter title


    【解决方案1】:

    我知道这个答案可能来得有点晚,但我最近也偶然发现了这个问题,你可以这样做:

    对于工具栏的问题,我可以参考这个问题: Displaying Matplotlib Navigation Toolbar in Tkinter via grid.

    NavigationToolbar 在内部调用 .pack() 并且 pack() 和 grid() 不能一起工作。但是你可以在你的根框架上创建一个 Tk.Frame 并在其中打包工具栏:

    toolbar_frame = Tk.Frame(root)
    toolbar_frame.grid(row=9,column=0)
    toolbar = NavigationToolbar2TkAgg(canvas, toolbar_frame) 
    toolbar.update() 
    

    如果要显示轴标签,请调用 plt.figure 而不是 Figure。这在我的情况下有效:

    fig = plt.figure(figsize=(5,4), dpi=100) 
    

    您编写代码的方式不适用于我的设置,因此我进行了一些其他更改。结果如下所示:

    from matplotlib import pyplot as plt
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
    #from matplotlib.figure import Figure
    #from Tkinter import *
    import Tkinter as Tk
    #import numpy as np
    #import math
    #import matplotlib
    #matplotlib.use('TkAgg')
    #from matplotlib.backend_bases import key_press_handler
    #import sys
    
    
    root = Tk.Tk()
    
    #Interface-----------------------------------------------------------
    
    title_label = Tk.Button(root,text = "Add graph title", padx=2,pady=2)
    xlabel = Tk.Button(root,text =      "Add X values    ", padx=2,pady=2)
    ylabel = Tk.Button(root,text =      "Add Y values    ", padx=2,pady=2)
    nameXaxis = Tk.Button(root,text =   "Name X axis      ", padx=2,pady=2)
    nameYaxis = Tk.Button(root,text =   "Name Y axis      ", padx=2,pady=2)
    meanLabel = Tk.Button(root,text = "Mean          ")
    stderrorLabel = Tk.Button(root,text = "StdError:     ")
    
    barGraph = Tk.Button(root,text = "Bar Graph  ",fg = "red", padx=2,pady=2)
    lineGraph = Tk.Button(root,text = "Line Graph", fg = "red",padx=2,pady=2)
    pieGraph = Tk.Button(root,text = "Pie Graph  ",fg = "red",padx=2,pady=2)
    
    titleEntry = Tk.Entry(root)
    xentry = Tk.Entry(root)
    yentry = Tk.Entry(root)
    nameXaxisEntry = Tk.Entry(root)
    nameYaxisEntry = Tk.Entry(root)
    meanText = Tk.Text(root,height=1,width=4)
    stderrText = Tk.Text(root,height=1,width=4)        
    
    
    title_label.grid(row = 0, column = 0,sticky = Tk.E)
    xlabel.grid(row = 1, column = 0, sticky = Tk.E)
    ylabel.grid(row = 2, column = 0, sticky = Tk.E)
    nameXaxis.grid(row = 3, column = 0, sticky = Tk.E)
    nameYaxis.grid(row = 4, column = 0, sticky = Tk.E)
    
    barGraph.grid(row = 0,column = 1,ipadx=10,sticky=Tk.W)
    lineGraph.grid(row = 1,column = 1,ipadx=10,sticky=Tk.W)
    pieGraph.grid(row = 2,column = 1,ipadx=10,sticky=Tk.W)
    
    meanLabel.grid(row = 3,column = 1,ipadx=10,sticky=Tk.W)
    stderrorLabel.grid(row = 4,column = 1,ipadx=10,sticky=Tk.W)                      
    
    
    titleEntry.grid(row = 0, column = 0,ipadx=100,sticky=Tk.W)
    xentry.grid(row = 1, column = 0,ipadx=100,sticky=Tk.W)
    yentry.grid(row = 2, column = 0,ipadx=100,sticky=Tk.W)
    nameXaxisEntry.grid(row = 3, column = 0,ipadx=100,sticky=Tk.W)
    nameYaxisEntry.grid(row = 4, column = 0,ipadx=100,sticky=Tk.W)
    meanText.grid(row=3,column=3,sticky=Tk.W)
    stderrText.grid(row=4,column=3,sticky=Tk.W)
    
    # Adding line graph to Canvas--------------------------------------------
    
    
    root.title("Naynts Graphs") 
    
    #fig = Figure(figsize=(5,4), dpi=100)
    fig = plt.figure(figsize=(5,4), dpi=100) 
    ax = fig.add_subplot(111) 
    
    canvas = FigureCanvasTkAgg(fig,root) 
    canvas.show() 
    canvas.get_tk_widget().grid(row=7,column=0) 
    
    toolbar_frame = Tk.Frame(root)
    toolbar_frame.grid(row=9,column=0)
    toolbar = NavigationToolbar2TkAgg(canvas, toolbar_frame) 
    toolbar.update() 
    #canvas._tkcanvas.grid(row=9,column=0)
    
    # Adding features to graph
    
    plt.xlabel('x label')
    plt.ylabel('y label')
    plt.title('Graph')
    plt.show()
    
    #root.mainloop()
    Tk.mainloop()
    

    我认为您使用了许多不必要的导入,这可能会相互冲突,对我来说就是这种情况 from Tkinter import *import Tkinter as Tk。希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2017-12-19
      • 2020-10-17
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多