Форум сайта python.su
Antarius, кстати довольно просто рисовать в JavaScript
www/index.html
<!DOCTYPE html/> <head> <title>HTML CANVAS</title> <meta http-equiv="content-type" content="text/html;charset=utf-8"/> <meta http-equiv="refresh" content="10"/> </head> <body> <canvas id="Canvas" width="800" height="600" style="border:1px solid #000;"> <script type="text/javascript" src="data.js"></script> <script type="text/javascript"> var doc = document.getElementById("Canvas"); var field = doc.getContext("2d"); var len = MyData.length var x = 0 field.font = "16px Times New Roman"; field.fillText("График HTML5 canvas JavaScript",300,20); field.moveTo(0,300); field.fillStyle = "#f00"; for (var i = 0; i < len; i ++) { var y = 300 - MyData[i] field.lineTo(x, y); field.fillRect(x-3,y-3,6,6) x += 10; } field.strokeStyle="#00f"; field.stroke(); </script> </canvas> </body> </html>
var MyData = [ 0,0,0,0,0,0,0,100,10,200,30,-100,40,20,50,-200,250,-100,200,100 ];
Отредактировано vic57 (Дек. 5, 2016 16:35:45)
Офлайн
Спасибо.
Оффтопик конечно, но может подскажете как сделать точный интервальный таймер?
Допустим надо интервал 10 сек.
Если делать time.sleep(), то получается не точно, т.к. сначала надо опросить датчики, нарисовать график, потом спать. А величину сколько спать приходится подгонять, и она все равно не точная.
Я сделал типа такого (это какой-то пример):
import threading
print ‘start’
def get1():
_ print u'hello'
_ t = threading.Timer(10.0, get1)
_ t.start()
t = threading.Timer(10.0, get1)
t.start()
Но думается мне, что это не правильный путь, т.к. как почитал начинается непонятка с забиванием памяти и плодящимися процессами. Может ткинтер из-за этого тормозить начинает, а не от того, что он старый и допотопный.
Хотя PIL мне понравился, я уже почти переписал программу под него. Много затыков в ошибках при переделывание ткинтеровских рисовашек в пиловские. Вроде одно и тоже, а синтаксис не похож…
Отредактировано Antarius (Дек. 6, 2016 09:03:29)
Офлайн
реакция ядра Линуха ~5 миллисек, и это если на С пишешь.
при 10 сек интервале я бы забил на точность и пользовал time.sleep()
GIL все равно тебе большую точность не даст.
https://habrahabr.ru/post/84629/
имхо правильный путь для тебя - передавать по сети данные и рисовать на стороне клиента
PIL ресурсоемкий, а у малины проц слабенький
вообще питон в реалтайме - не есть гут.
Отредактировано vic57 (Дек. 6, 2016 09:34:28)
Офлайн
vic57Это для меня очень сложно, я даже не знаю с какого бока к этому подходить.
имхо правильный путь для тебя - передавать по сети данные и рисовать на стороне клиента
Офлайн
я ж тебе дал пример JavaScript
обновление данных
www/data_update.py
# #!/usr/bin/env python #coding:utf-8 from random import randint import time import os.path X=800 OFFSET=10 RING_SIZE=X/OFFSET + 1 def update(fname): if not os.path.isfile("data.js"): lst = ['0' for _ in xrange(RING_SIZE)] s = ",".join(lst) f = open("data.js","w+") f.write("var MyData = [" + '\n') f.write(s + '\n') f.write("];") f.close() return f = open(fname) lines = f.readlines() f.close() if len(lines) > 2: lst = lines[1].strip().split(',') else: lst= [] lst.append(str(randint(0,300) -150)) if len(lst) > RING_SIZE: lst.pop(0) s = ",".join(lst) f = open(fname,"w+"); f.write("var MyData = [" + '\n') f.write(s + '\n') f.write("];") f.close() if __name__=="__main__": while True: update("data.js") time.sleep(1)
cd www data_update.py & #запуск в фоне python -m SimpleHTTPServer
Отредактировано vic57 (Дек. 6, 2016 09:56:43)
Офлайн
Т.е. скрипт в index.html на java будет выполняться на машине клиента и график рисоваться за счет ее ресурсов, а не малины?
Проблема в том, что помимо просто графика, там много чего еще надо нарисовать, метки, какую-то графику поверх графика с данными. А Java я не разумею.
Интересно, а есть какие-то визуальные конструкторы java, типа - графического редактора, проектируешь свою форму, вставляешь туда графики, кнопочки, тексты…. получешь готовый скрипт
Ну это я так.
Пока мне достаточно информации для размышлений по питону, не готов углубляться во что-то новое.
Офлайн
AntariusJava и JavaScript - абсолютно разные языки
Java я не разумею.
<!DOCTYPE html/> <head> <title>HTML5 CANVAS</title> <meta http-equiv="content-type" content="text/html;charset=utf-8"/> <!-- автообновление 5 сек--> <meta http-equiv="refresh" content="5"/> </head> <body> <canvas id="Canvas" width="800" height="600" style="border:2px solid #000;"> </canvas> <!-- data.js загружается с сервера, определяется MyData --> <script type="text/javascript" src="data.js"></script> <script type="text/javascript"> var doc = document.getElementById("Canvas"); var cont = doc.getContext("2d"); //начало рисования фон cont.fillStyle="#eee"; cont.fillRect(0,0,800,600); //заголовок cont.font = "16px Times New Roman"; cont.fillStyle="#f00"; cont.fillText("График HTML5 canvas JavaScript",300,20); //данные var len = MyData.length; var x = 0; cont.beginPath(); cont.moveTo(0,300); cont.fillStyle = "#00f"; cont.strokeStyle="#00f"; cont.lineWidth = 0.7; for (var i = 0; i < len; i ++) { var y = 300 - MyData[i]; cont.lineTo(x,y); cont.fillRect(x-2,y-2,4,4); x += 10; } cont.stroke(); //сетка cont.beginPath(); cont.moveTo(0,0); cont.strokeStyle="#000"; cont.lineWidth = 0.2; for (var i = 100; i < 800; i += 100) { cont.moveTo(i,0); cont.lineTo(i,600); } for (var i = 100; i < 600; i += 100) { cont.moveTo(0,i); cont.lineTo(800,i); } cont.stroke(); //ось Y cont.beginPath(); cont.moveTo(0,300); cont.strokeStyle="#000"; cont.lineWidth = 0.7; cont.lineTo(800,300); cont.stroke(); //шкала XY cont.font = "14px Times New Roman"; cont.fillStyle="#333"; for (var i = 100; i < 800; i += 100) { cont.fillText(i,i,300); } for (var i = 0; i < 600; i += 100) { cont.fillText(300-i,5,i); } </script> </body> </html>
Antariusя пользую QtDesigner
есть какие-то визуальные конструкторы
Офлайн
Спасибо, очень интересно.
Но я чего-то не разберусь, если index.html лежит на малине, открывает файл с данными на малине, то получается, он может получить доступ и к GPIO портам малины и собственно сам опросить датчики. Единственное, что он это сделает только в момент запроса его через веб, а не с регулярно с шагом в 10 сек…. Эдак и питон не нужен окажется.
Офлайн
Antariusтогда у тебя любой клиент обвалит сервер
Спасибо, очень интересно.Но я чего-то не разберусь, если index.html лежит на малине, открывает файл с данными на малине, то получается, он может получить доступ и к GPIO портам малины и собственно сам опросить датчики. Единственное, что он это сделает только в момент запроса его через веб, а не с регулярно с шагом в 10 сек…. Эдак и питон не нужен окажется.
Отредактировано vic57 (Дек. 6, 2016 14:07:23)
Офлайн
И еще, если позволите, вопрос.
А на JS есть возможность развернуть окно на весь экран, убрав все следы от браузера? А потом, допустим по нажатию на кнопку на экране вернуть обратно?
Тогда можно на малине открыть браузер и пусть она показывает собственный вебсервер. Но эстетически браузер не хочется.
Офлайн