2015-08-13 1 views
2

Я создаю программу, которая включает matplotlib в tkinter. Большинство программ работает, включая отображение холста графика, однако заголовок графика, панель навигации и легенды xy не отображаются. Часть кода я задаюсь вопросом о том, на самом дне сценария:tkinter и matplotlib canvas показывает, но не панель навигации и название графика

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() 

ответ

2

Я знаю, что этот ответ может прийти немного поздно, но я наткнулся на эту проблему, в последнее время, а также и вот что вы можете сделать:

Для вашей проблемы с панели инструментов, я могу сослаться на этот вопрос: Displaying Matplotlib Navigation Toolbar in Tkinter via grid.

Навигационные вызовы .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 вместо рис. Это сработало в моем случае:

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. Надеюсь это поможет!