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

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

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



整个程序的代码如下:

    

import pygame,os,sys
from pygame.locals import *
import random,math
zoomt = 1.0     
zoomy = 1.0
pulse = 20
amp = 100
def 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.key
def 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 = 0
while 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)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值