2017-06-06 153 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