Tkinter 例子
#!/usr/bin/env python import pylab from pylab import * import Tkinter from Tkinter import * import serial from numpy import * from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg root = Tkinter.Tk() root.wm_title("Chocolate Oscilloscope (By Wenzhe_Qiu)") xAchse=pylab.arange(0,100,1) yAchse=pylab.array([0]*100) fig = pylab.figure(1) ax = fig.add_subplot(111) ax.grid(True) ax.set_title("Chocolate Oscilloscope Frontend (COM4)") ax.set_xlabel("Time (ms)") ax.set_ylabel("Amplitude (V)") ax.axis([0,100,-1.5,1.5]) line1=ax.plot(xAchse,yAchse,'-') canvas = FigureCanvasTkAgg(fig, master=root) canvas.show() canvas.get_tk_widget().pack(side=Tkinter.TOP, fill=Tkinter.BOTH, expand=1) toolbar = NavigationToolbar2TkAgg( canvas, root ) toolbar.update() canvas._tkcanvas.pack(side=Tkinter.TOP, fill=Tkinter.BOTH, expand=1) values=[] values = [0 for x in range(100)] run=1 sampling_freq=1000 sampling_time=float(1000/float(sampling_freq)) NumberSamples=100 #s=serial.Serial(port='COM4') #open port COM4 s=serial.Serial(port='COM4', baudrate=115200) #Receive data by pc.putc() def waveformGenerator(): global values _next=s.readline() _next=float(_next)/1000 if(run==1): if(_next<=1): _next=3.3 * _next values.append(_next) root.after(0,waveformGenerator) #def RealtimePloter(): # global values,wScale,NumberSamples,sampling_time # NumberSamples=min(len(values),wScale.get()) # real_time=NumberSamples*sampling_time; # interval=sampling_time # CurrentXAxis=linspace(0,real_time,NumberSamples) # line1[0].set_data(CurrentXAxis,pylab.array(values[-NumberSamples:])) # ax.axis([0,real_time,-0.5,4]) # canvas.draw() # root.after(25,RealtimePloter) def RealtimePloter(): global values,wScale,sampling_freq,interval NumberSamples=min(len(values),wScale.get()*sampling_freq/1000) interval=float(float (wScale.get())/float (NumberSamples)) CurrentXAxis=linspace(0,wScale.get(),NumberSamples) line1[0].set_data(CurrentXAxis,pylab.array(values[-NumberSamples:])) ax.axis([0,wScale.get(),-0.5,4]) canvas.draw() root.after(25,RealtimePloter) def _quit(): print "Bye" s.close() # close the port root.quit() # stops mainloop root.destroy() # this is necessary on Windows to prevent # Fatal Python Error: PyEval_RestoreThread: NULL tstate def _set(): global sampling_time s.write(str(wScale_sample_freq.get())+'\n') sampling_freq=wScale_sample_freq.get() sampling_time=float(float(1/float(sampling_freq))*1000) print "The current sampling frequency is " + str(wScale_sample_freq.get()) + "Hz !" print "The sampling time interval is " + str(sampling_time) + " ms" def _PS(): s.write("2000\n") def _STOP_IMAGE(): global run run=~run def _channel_change_to_15(): s.write("1010\n") print"The current channel is 15 !" def _channel_change_to_16(): s.write("1020\n") print"The current channel is 16 !" def _channel_change_to_17(): s.write("1030\n") print"The current channel is 17 !" def _channel_change_to_18(): s.write("1040\n") print"The current channel is 18 !" def _channel_change_to_19(): s.write("1050\n") print"The current channel is 19 !" def _channel_change_to_20(): s.write("1060\n") print"The current channel is 20 !" ########## frame_widget_definition ######### frame_1 = Frame(height=10, bd=1, relief=SUNKEN) frame_2 = Frame(height=10, bd=1, relief=GROOVE) frame_3 = Frame(master=frame_2, height=10, bd=1, relief=GROOVE) #relief:Border decoration. The default is FLAT. Other possible values are SUNKEN, RAISED, GROOVE, and RIDGE #frame widget reference:http://effbot.org/tkinterbook/frame.htm frame_1.pack(side=Tkinter.LEFT) frame_2.pack(side=Tkinter.RIGHT) frame_3.pack(side=Tkinter.BOTTOM) ########## button_widget_definition ######### button = Tkinter.Button(master=frame_3, text=' SET ', command=_set) button_PS = Tkinter.Button(master=frame_3, text=' PAUSE/START CHANNEL ', command=_PS) button_SI = Tkinter.Button(master=frame_3, text=' STOP/RUN IMAGE ', command=_STOP_IMAGE) button_quit = Tkinter.Button(master=frame_3, text=' QUIT ', command=_quit) button.pack(side=Tkinter.LEFT) button_PS.pack(side=Tkinter.LEFT) button_SI.pack(side=Tkinter.LEFT) button_quit.pack(side=Tkinter.RIGHT) ########## wScale_widget_definition ######### wScale = Tkinter.Scale(master=frame_2,label="Time Scale (ms):", from_=1, to=1000,sliderlength=30,length=ax.get_frame().get_window_extent().width, orient=Tkinter.HORIZONTAL) wScale_sample_freq = Tkinter.Scale(master=frame_2,label="Sampling Frequency (Hz): (Click SET button for comfirmation)", from_=3, to=1000,sliderlength=30,length=ax.get_frame().get_window_extent().width, orient=Tkinter.HORIZONTAL) wScale.pack(side=Tkinter.TOP) wScale_sample_freq.pack(side=Tkinter.TOP) wScale.set(500) wScale_sample_freq.set(1000) ########## radiobutton_widget_definition ######### v = IntVar() v.set(1) print "The default channel is 15 !" Radiobutton(frame_1, text="Channel 15", variable=v, value=1, command=_channel_change_to_15).pack(anchor=W) Radiobutton(frame_1, text="Channel 16", variable=v, value=2, command=_channel_change_to_16).pack(anchor=W) Radiobutton(frame_1, text="Channel 17", variable=v, value=3, command=_channel_change_to_17).pack(anchor=W) Radiobutton(frame_1, text="Channel 18", variable=v, value=4, command=_channel_change_to_18).pack(anchor=W) Radiobutton(frame_1, text="Channel 19", variable=v, value=5, command=_channel_change_to_19).pack(anchor=W) Radiobutton(frame_1, text="Channel 20", variable=v, value=6, command=_channel_change_to_20).pack(anchor=W) # radiobutton widget reference:http://effbot.org/tkinterbook/radiobutton.htm root.after(100,waveformGenerator) root.after(100,RealtimePloter) Tkinter.mainloop()
posted on 2012-12-18 07:48 cosmo89929 阅读(1056) 评论(0) 编辑 收藏 举报