2017-07-06 71 views
1

我有一個GUI,用戶可以在其中加載日誌文件,並可以查看框架中的日誌文件,並突出顯示文件中的警告和錯誤。基於來自tkinter中文件的輸入創建圖形

我也試圖通過創建一個包含用戶選擇的日誌文件中的ID和時間戳的圖來可視化該文件的數據。我已經能夠分別使用matplotlib創建圖形,並使用plt.show()顯示圖形。

但是我無法將它嵌入到我的tkinter GUI中。我嘗試了很多東西,但只能得到座標軸而不是實際的棒圖。當用戶選擇要加載的文件時,會出現日誌文件等,但在畫布區域中,只有軸顯示並且沒有繪圖。

這裏是我的代碼部分:

import matplotlib 

matplotlib.use('TkAgg') 

from matplotlib.backends.backend_tkagg import \ 
    FigureCanvasTkAgg,NavigationToolbar2TkAgg 

from matplotlib.figure import Figure 

import matplotlib.pyplot as plt 

from tkinter import * 

from tkinter import ttk 

from tkinter.filedialog import askopenfilename 

link,warn_list,frame_id, timeStamp=[[] for _ in range(4)] 

root= Tk() 

Title=root.title("Tool") 

label=ttk.Label(root, text="Welcome",foreground='purple',font=("Times 20 bold italic")) 

label.pack() 

frame1=ttk.LabelFrame(root,labelanchor=NW,height=500,width=500,text='Static Information') 

frame1.pack(fill=BOTH,expand=True) 

text_static=Text(frame1,width=45, height=15,bg='lightgray') 

text_static.pack(side=LEFT,fill=BOTH) 

def loadfile(): 

    filename=askopenfilename(parent=root,filetypes=(("Text File","*.txt"), ("All Files","*.*")),title='Choose a file') 
    with open(filename, 'r')as log: 
     for num,line in enumerate(log,1): 
      if line.find("cam_req_mgr_process_sof")!=-1: 
        line=line.split() 
        frame_id.append(line [-1]) 
        timeStamp.append(line[3].replace(":", "")) 


menu=Menu(root) 
root.config(menu=menu) 

file=Menu(menu) 

file.add_command(label='Load', command=loadfile) 

file.add_command(label='Exit',command=root.destroy) 

menu.add_cascade(label='Select an option:', menu=file) 

def graph(): 

    fig=plt.Figure()    
    x=frame_id #can use x=range(1,38) 
    y=[1]*len(x) 

    ax=fig.add_subplot(111) 
    ax.bar(x,y,width=0.5, color='lightgreen') 
    return fig 

plot=graph() 

canvas=FigureCanvasTkAgg(plot,frame1) 

canvas.get_tk_widget().pack() 

toolbar=NavigationToolbar2TkAgg(canvas,frame1) 

toolbar.update() 

canvas._tkcanvas.pack() 

root.mainloop() 

see the result here

回答

0

的圖形繪製幾乎工程!但不是通過加載文件。問題是你沒有使用新的數據集來更新畫布,而且你也不會將它們轉換爲數字(浮點型?整數?)

您有時達到了設計此工具的函數式方法的限制,因爲你需要參考frame_idcanvas裏面的函數。 1或2班可以更容易地解決這個問題。

作爲速戰速決,我建議這樣的功能:

def loadfile(): 
    global frame_id # reach outside scope to use frame_id 
    frame_id = [] 
    filename=askopenfilename(parent=root, 
          filetypes=(("Text File","*.txt"), 
             ("All Files","*.*")), 
          title='Choose a file') 
    with open(filename, 'r')as log: 
     for num,line in enumerate(log,1): 
      if line.find("cam_req_mgr_process_sof")!=-1: 
        line=line.split() 
        frame_id.append(float(line [-1])) # cast to float 
        timeStamp.append(line[3].replace(":", "")) 
    newplot = graph() 
    newplot.canvas = canvas 
    canvas.figure = newplot 
    canvas.draw()