我放在一起的代码设法完成工作(打开文件,解释数据,绘制结果),但matplotlib窗口非常慢。当我运行没有GUI(tkinter)的代码版本时,速度更快。我是否已经在实现tkinter类中做了一些事情来减慢速度?或者这只是使用GUI的副作用?
顺便说一下,我主要是自学成才,所以对一般风格的反馈也很受欢迎。
以下是代码:
import numpy as np
import tkinter as tk
from tkinter import ttk
from tkinter.filedialog import askopenfilename
from matplotlib import pyplot as plt
class App(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self,master)
tk_lowcut = tk.StringVar()
tk_highcut = tk.StringVar()
tk_filename = tk.StringVar()
tk_lowcut.set(30)
tk_highcut.set(60)
def getfilename():
filename = askopenfilename()
tk_filename.set(filename)
def plot():
def csv_reader(file_obj):
A = np.genfromtxt(file_obj, delimiter=',' , skip_header=3)
t = A[ : ,0]
a = A[ : ,1]
return A, t, a;
def f_domain(channel_a):
f_t = np.fft.fft(channel_a)
return f_t;
def f_freq(size,step):
f_f = np.fft.fftfreq(size, d=step)
return f_f;
def bandpass(signal, W, low, high):
cut_f_signal = signal.copy()
cut_f_signal[(W<low)] = 0
cut_f_signal[(W>high)] = 0
cut_signal = np.fft.ifft(cut_f_signal)
return cut_f_signal, cut_signal;
plt.clf()
f_obj = tk_filename.get()
A, t, signal = csv_reader(f_obj)
lowcut = np.float(tk_lowcut.get())
highcut = np.float(tk_highcut.get())
f_signal = f_domain(signal)
freq = f_freq(t.size, t[2]-t[1])
cut_f_signal, cut_signal = bandpass(f_signal, freq, lowcut, highcut)
fig = plt.figure(1)
fig.suptitle(f_obj, fontsize=18, family='monospace',
weight='bold', color='blue')
plt.subplot(2,2,1)
plt.scatter(t,signal)
plt.title('Raw Time Domain')
plt.axis([-0.07,4,-350,350])
plt.subplot(2,2,3)
plt.scatter(freq,20*np.log10(np.abs(f_signal)))
plt.title('Raw Frequency Domain')
plt.axis([0,9000,0,140])
plt.subplot(2,2,4)
plt.scatter(freq,20*np.log(np.abs(cut_f_signal)))
plt.title('Filtered Frequency Domain')
plt.axis([20,50,150,300])
plt.subplot(2,2,2)
plt.scatter(t,cut_signal)
plt.title('Filtered Time Domain')
plt.axis([-0.07,4,-350,350])
plt.show()
content = ttk.Frame(self, padding=(5,5,12,12))
content.grid()
ttk.Button(content,text='Choose Data File',command=getfilename).grid(column=0,
row=1, columnspan=4, sticky=(tk.E,tk.W), padx=5, pady=5)
tk.Label(content, text='Low Cut:').grid(column=0, row=0)
low_entry = tk.Entry(content, width=7, textvariable=tk_lowcut)
low_entry.grid(column=1, row=0)
tk.Label(content, text='High Cut:').grid(column=2, row=0)
high_entry = tk.Entry(content, width=7, textvariable=tk_highcut)
high_entry.grid(column=3, row=0)
tk.Label(content, textvariable=tk_filename).grid(row=2, columnspan=4)
ttk.Button(content,text='Plot',command=plot).grid(column=0,
row=3, columnspan=4, sticky=(tk.E,tk.W), padx=5, pady=5)
def main():
root = tk.Tk()
root.wm_title('Data Plotter')
App(root).grid()
root.mainloop()
if __name__== "__main__":
main()