使用Python和pyGame进行虚拟仪器开发

来源:互联网 发布:js替换p标签里的值 编辑:程序博客网 时间:2024/04/29 07:03

    (说明: 这是我2007年写在cublog(China Unix)上的博客,现在把它转到这里来.) 

    偶然发现pygame的高速绘图效果,于是忽然想做一个虚拟示波器,以前经常见到基于 visual C++ 的收费的类库,感觉太复杂了,根本没想过要自己写一个.然而使用python后,一切都变得很简单了.
    当然,目前只用生成的正弦虚拟数据来显示了,没有真正加入声卡Line-In数据.
    目前还不能用鼠标来调整波形缩放,只能使用四个键 上下[幅度放大/缩小],左右[时间方法/缩小].程序的运行结果如下:



整个程序的代码如下:

    

import pygame,os,sysfrom pygame.locals import *import random,mathzoomt = 1.0     zoomy = 1.0pulse = 20amp = 100def get_input(events):       #事件捕捉函数    global zoomt    global zoomy    global pulse    for event in events:        if event.type == QUIT:                    sys.exit(0)        elif event.type == KEYDOWN:            if event.key == 275:                       if zoomt < 20:                    zoomt += 0.1                else:                    zoomt = 20            elif event.key == 276:                if zoomt > 0.1:                    zoomt -= 0.1                else:                    zoomt = 0.1            if event.key == 274:                if zoomy >= 0.0024:                    zoomy /= 1.2                else:                    zoomy = 0.0024            elif event.key == 273:                if zoomy <= 0.8:                    zoomy *= 1.2                else:                    zoomy = 1.0            if event.key == 44:                if pulse < 200:                    pulse += 1                else:                    pulse = 100            elif event.key == 46:                if pulse > 1:                    pulse -= 1                else:                    pulse = 1            print event.keydef showText(screen,txt,size,pos):    #在界面显示字符    myfont = pygame.font.SysFont("Vera", size)    screen.blit(myfont.render(txt, 1, (255,255,0)), pos)def putChart(screen,data,backColor,lineColor,zoom,zoomy,width): #示波器界面生成    size = (298,222)    u_size = screen.get_size()    face = pygame.Surface(size)    face = face.convert()    #face.fill(backColor)    #rect = [(10,10),(10,250),(330,250),(330,10)]    #pygame.draw.polygon(face,(255,255,255),rect)    lenx = len(data)    leny = 100    first = 1    points = [(0,0)]    for i in range(lenx):    #print lenx - i        if first == 1:            points[0] = (int(float(i) * zoom * size[0]/float(lenx)),size[1]/2 - (data[i] * zoomy))            first = 0        else:            points.append((int(float(i) * zoom * size[0]/float(lenx)),size[1]/2 - (data[i]* zoomy)))            pygame.draw.aalines(face,lineColor,0,points,width)    screen.blit(face,(30,29))pygame.init()window = pygame.display.set_mode((600,301))pygame.display.set_caption("Oscilloscope with sine Data    ----Powered by yuanshl")face = pygame.image.load(os.path.join("d:\\python","oscope2.jpg"))screen = pygame.display.get_surface()screen.blit(face,(0,0))pygame.display.flip()d = range(100)clock = pygame.time.Clock()for i in range(100):    #生成100个点的正弦数据    d[i] = 111.0 * math.sin(2*3.141592*i/25)count = 0while 1:    count += 1    if count % pulse == 0:        for i in range(100):            d[i] = 111.0 * math.sin(2*3.141592*(i)/25 + float(count)/20.0)    putChart(screen,d,(255,0,0),(0,0,255),zoomt,zoomy,1)    get_input(pygame.event.get())    fps = clock.get_fps()    #print "fps = ",fps    clock.tick()    s = "%0.2f %0.2f %0.2f %d"%(fps,zoomt,zoomy,pulse)    showText(screen,s,20,(30,29))    pygame.display.update()    #pygame.time.delay(80)