2011-12-15 1 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 «Refresh». Содержимое заголовка должно состоять из двух элементов, разделенных точкой с запятой. Первым будет 2 (количество секунд после обновления), а второе будет URL-адресом страницы (так как вы хотите, чтобы контент повторялся). Вы также можете использовать META-тег для инъекции псевдо-заголовка из вашего содержимого страницы, если хотите.

К сожалению, это будет означать некоторую реорганизацию вашего заднего конца, потому что страница теперь должна доставлять представление текущего состояния вычисления каждый раз, когда он вызывается. Это не обязательно будет легко.

Чтобы создать страницу, на которой сервер может просто «нажимать» новый контент, когда захочет, вам нужно будет немного программировать. Рассмотрите возможность доставки потока сценариев, которые устанавливают атрибут InnerHTML DIV в HTML для следующего графика, а не просто доставку чистого HTML. Затем попросите эту страницу запросить этот контент. Это имеет дополнительное преимущество в том, что страница не будет полностью обновляться при каждом новом графике.