Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 5, 2016 16:25:43

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Начинает тормозить TKinter

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>
все что нужно - обновлять data.js
www/data.js
 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)

Офлайн

#2 Дек. 6, 2016 08:47:25

Antarius
Зарегистрирован: 2016-11-28
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Начинает тормозить TKinter

Спасибо.
Оффтопик конечно, но может подскажете как сделать точный интервальный таймер?
Допустим надо интервал 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)

Офлайн

#3 Дек. 6, 2016 09:26:42

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Начинает тормозить TKinter

реакция ядра Линуха ~5 миллисек, и это если на С пишешь.
при 10 сек интервале я бы забил на точность и пользовал time.sleep()
GIL все равно тебе большую точность не даст.
https://habrahabr.ru/post/84629/
имхо правильный путь для тебя - передавать по сети данные и рисовать на стороне клиента
PIL ресурсоемкий, а у малины проц слабенький
вообще питон в реалтайме - не есть гут.

Отредактировано vic57 (Дек. 6, 2016 09:34:28)

Офлайн

#4 Дек. 6, 2016 09:37:30

Antarius
Зарегистрирован: 2016-11-28
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Начинает тормозить TKinter

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

Офлайн

#5 Дек. 6, 2016 09:55:26

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Начинает тормозить TKinter

я ж тебе дал пример 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
и смотри в брузере http://localhost:8000

Отредактировано vic57 (Дек. 6, 2016 09:56:43)

Офлайн

#6 Дек. 6, 2016 10:37:52

Antarius
Зарегистрирован: 2016-11-28
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Начинает тормозить TKinter

Т.е. скрипт в index.html на java будет выполняться на машине клиента и график рисоваться за счет ее ресурсов, а не малины?
Проблема в том, что помимо просто графика, там много чего еще надо нарисовать, метки, какую-то графику поверх графика с данными. А Java я не разумею.
Интересно, а есть какие-то визуальные конструкторы java, типа - графического редактора, проектируешь свою форму, вставляешь туда графики, кнопочки, тексты…. получешь готовый скрипт
Ну это я так.

Пока мне достаточно информации для размышлений по питону, не готов углубляться во что-то новое.

Офлайн

#7 Дек. 6, 2016 13:20:00

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Начинает тормозить TKinter

Antarius
Java я не разумею.
Java и JavaScript - абсолютно разные языки
js выполняется в браузере, по сложности примерно как бэйсик
у меня руки до него все не доходили, сейчас разобрался
www/index.html
 <!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>
http://www.html5canvas.ru/2012/12/canvas.html
имхо для рисования более чем
Antarius
есть какие-то визуальные конструкторы
я пользую QtDesigner

Офлайн

#8 Дек. 6, 2016 13:37:38

Antarius
Зарегистрирован: 2016-11-28
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Начинает тормозить TKinter

Спасибо, очень интересно.
Но я чего-то не разберусь, если index.html лежит на малине, открывает файл с данными на малине, то получается, он может получить доступ и к GPIO портам малины и собственно сам опросить датчики. Единственное, что он это сделает только в момент запроса его через веб, а не с регулярно с шагом в 10 сек…. Эдак и питон не нужен окажется.

Офлайн

#9 Дек. 6, 2016 13:58:32

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Начинает тормозить TKinter

Antarius
Спасибо, очень интересно.Но я чего-то не разберусь, если index.html лежит на малине, открывает файл с данными на малине, то получается, он может получить доступ и к GPIO портам малины и собственно сам опросить датчики. Единственное, что он это сделает только в момент запроса его через веб, а не с регулярно с шагом в 10 сек…. Эдак и питон не нужен окажется.
тогда у тебя любой клиент обвалит сервер
по соображениям безопасности браузер не имеет доступа к файловой системе сервера
файл данных по любому надо делать на сервере и класть в директорию сайта (www в твоем случае)
посмотри Умный дом, там полно про малину с удаленным управлением

Отредактировано vic57 (Дек. 6, 2016 14:07:23)

Офлайн

#10 Дек. 6, 2016 14:06:35

Antarius
Зарегистрирован: 2016-11-28
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Начинает тормозить TKinter

И еще, если позволите, вопрос.
А на JS есть возможность развернуть окно на весь экран, убрав все следы от браузера? А потом, допустим по нажатию на кнопку на экране вернуть обратно?
Тогда можно на малине открыть браузер и пусть она показывает собственный вебсервер. Но эстетически браузер не хочется.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version