2011-12-15 87 views
0

我需要实时显示图形中的动态数据。 因此,我需要每秒钟绘制一张更新数据的新图。Python空cgi浏览器屏幕

的问题是,我不能清空以前的输出在浏览器 等,而不是得到一个简单的图形与更新的数据 我得到很多的图表

的这里是代码。目前它有随机数据

def graph(data): 
    X,Y = 500, 275 #image width and height 
    img = Image.new("RGB", (X,Y), "#FFFFFF") 
    draw = ImageDraw.Draw(img) 

    #draw some axes and markers 
    for i in range(X/10): 
     draw.line((i*10+30, Y-15, i*10+30, 20), fill="#DDD") 
     if i % 5 == 0: 
      draw.text((i*10+15, Y-15), `i*10`, fill="#000") 
    for j in range(1,Y/10-2): 
     draw.text((0,Y-15-j*10), `j*10`, fill="#000") 
    draw.line((20,Y-19,X,Y-19), fill="#000") 
    draw.line((19,20,19,Y-18), fill="#000") 

    for i in range(1,len(data)): 
     draw.line((i+20,Y-20,i+20,Y-20-data[i]), fill="#000") 

    rtime = str(time.time()) 
    img.save("../images/out.png"+rtime, "PNG") 

    htmlBody = [] 
    htmlBody.insert(0, 'Content-type: text/html; charset=UTF-8\n') 
    htmlBody.append('<html>')  
    htmlBody.append('<body>')  
    htmlBody.append('<img src=\"../images/out.png'+rtime+'\" alt=\"\" />') 

    htmlBody.append("</body>") 
    htmlBody.append('</html>') 
    sys.stdout.flush() 
    sys.stdout.write('\n'.join(htmlBody)) 
    sys.stdout.flush() 





data = [] 
if (printgraph!=None): 
    sys.stdout = sys.stderr = oldsysout 
    for i in range(1,5): 
     data.append(int(250*(random.random()))) 
     graph(data) 
     sys.stdout.flush() 
     time.sleep(1) 
    exit() 

回答

0

我会创建一个单独的CGI脚本来创建图像。然后,您可以在图像标记中引用新脚本。 src="makepic.py"

跟随this guide使Python脚本为动态图像提供服务。在页面上,您可以使用JavaScript的settimeout刷新图像。

0

您可以考虑使用HTTP“刷新”标题的页面。标题的内容应该是用分号分隔的两个项目。第一个是2(刷新秒数),第二个是页面的URL(因为你想要重复的内容)。如果您愿意,也可以使用META标记从页面内容中插入一个伪标题。

不幸的是,这意味着需要重新组织您的后端,因为页面现在必须在每次调用时提供当前计算状态的表示。这不一定容易。

要创建一个服务器可以随时“推”新内容的页面,您需要进行一些编程。考虑为下一个图形提供一个将DIV的InnerHTML属性设置为HTML的脚本流,而不仅仅是提供纯HTML。然后让你的页面请求这个内容。这还有一个好处,即每次传递新图形时页面都不会完全刷新。