2017-06-06 97 views
0

我要绘制的函数图形(使用matplotlib)当按钮被按下,这样做,我写了下面的代码:Matplotlib - 情节不​​会出现

##--IMPORT 
#Tkinter 
from tkinter import Tk, ttk 
from tkinter import Frame, LabelFrame, Button 
from tkinter import FALSE 
#Numpy 
from numpy import linspace 
#Sympy 
from sympy import symbols,sympify,diff,N,log 
#MathPlotLib 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
from matplotlib.figure import Figure 

_x = symbols("x") 
_sympyFunction = None 
_SP_mainSubPlot = None 

def pr_draw(plotToDrawTo): 

    _sympyFunction = sympify("log(x) + x") 
    valuesRange = linspace(0.01, 3, 100) 

    x = [] 
    y = [] 

    #Calculate y and x values 
    for i in range(0, len(valuesRange)): 
     tempValue = N(_sympyFunction.subs(_x,valuesRange[i])) 

     x.append(float(valuesRange[i])) 
     y.append(float(tempValue)) 

    #Draw function graph 
    plotToDrawTo.plot(x,y) 

##--MAIN 
if __name__== "__main__": 

    _root = Tk() 
    _root.title("Grafico Approsimativo") 
    _root.resizable(width = FALSE, height = FALSE) 

    _mainFrame = Frame(_root, bg = "black") 
    _mainFrame.pack(fill = "both", expand = True) 


    #Frames 
    #Main Left 
    _F_LeftMainFrame = Frame(_mainFrame) 
    _F_LeftMainFrame.grid(row = 0, column = 0, sticky = "nw") 

    _F_RightMainFrame = Frame(_mainFrame, bg = "violet") 
    _F_RightMainFrame.grid(row = 0, column = 2, sticky = "ne") 


    #Left Content-------------------------- 
    _B_calculate = Button(_F_LeftMainFrame, text = "Draw", command = lambda: pr_draw(_SP_mainSubPlot)) 
    _B_calculate.grid(row = 0, column = 0, padx = 5, pady = 5, sticky = "w") 

    #Right Content-------------------------- 
    _F_mainPlotWindow = Figure(figsize = None, dpi = 100) 

    _SP_mainSubPlot = _F_mainPlotWindow.add_subplot(111) 
    _SP_mainSubPlot.grid(True) 

    #HERE 



    #Set master frame for Figure Obj 
    canvas = FigureCanvasTkAgg(_F_mainPlotWindow, master = _F_RightMainFrame) 
    canvas.get_tk_widget().pack() 

这里的问题是,当按钮被按下时,没有任何东西显示在绘图窗口中,唯一可以让它工作的方法是通过调用pr_draw(_SP_mainSubPlot)插入#HERE行:如果函数被调用,它将起作用,但不能从按钮中起作用为什么?

回答

0

您需要在绘制完成后重新绘制画布。

添加行

plotToDrawTo.figure.canvas.draw_idle() 

pr_draw函数的结尾应该这样做。

请注意,我还必须在脚本的末尾添加_root.mainloop()以实际显示窗口。

+0

非常感谢!而对于_root.mainloop(),我忘了在问题中复制它。 – Luke84