Найти - Пользователи
Полная версия: Начинает тормозить TKinter
Начало » GUI » Начинает тормозить TKinter
1 2 3 4 5 6 7
vic57
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
];
Antarius
Спасибо.
Оффтопик конечно, но может подскажете как сделать точный интервальный таймер?
Допустим надо интервал 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 мне понравился, я уже почти переписал программу под него. Много затыков в ошибках при переделывание ткинтеровских рисовашек в пиловские. Вроде одно и тоже, а синтаксис не похож…
vic57
реакция ядра Линуха ~5 миллисек, и это если на С пишешь.
при 10 сек интервале я бы забил на точность и пользовал time.sleep()
GIL все равно тебе большую точность не даст.
https://habrahabr.ru/post/84629/
имхо правильный путь для тебя - передавать по сети данные и рисовать на стороне клиента
PIL ресурсоемкий, а у малины проц слабенький
вообще питон в реалтайме - не есть гут.
Antarius
vic57
имхо правильный путь для тебя - передавать по сети данные и рисовать на стороне клиента
Это для меня очень сложно, я даже не знаю с какого бока к этому подходить.

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
и смотри в брузере http://localhost:8000
Antarius
Т.е. скрипт в index.html на java будет выполняться на машине клиента и график рисоваться за счет ее ресурсов, а не малины?
Проблема в том, что помимо просто графика, там много чего еще надо нарисовать, метки, какую-то графику поверх графика с данными. А Java я не разумею.
Интересно, а есть какие-то визуальные конструкторы java, типа - графического редактора, проектируешь свою форму, вставляешь туда графики, кнопочки, тексты…. получешь готовый скрипт
Ну это я так.

Пока мне достаточно информации для размышлений по питону, не готов углубляться во что-то новое.
vic57
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
Antarius
Спасибо, очень интересно.
Но я чего-то не разберусь, если index.html лежит на малине, открывает файл с данными на малине, то получается, он может получить доступ и к GPIO портам малины и собственно сам опросить датчики. Единственное, что он это сделает только в момент запроса его через веб, а не с регулярно с шагом в 10 сек…. Эдак и питон не нужен окажется.
vic57
Antarius
Спасибо, очень интересно.Но я чего-то не разберусь, если index.html лежит на малине, открывает файл с данными на малине, то получается, он может получить доступ и к GPIO портам малины и собственно сам опросить датчики. Единственное, что он это сделает только в момент запроса его через веб, а не с регулярно с шагом в 10 сек…. Эдак и питон не нужен окажется.
тогда у тебя любой клиент обвалит сервер
по соображениям безопасности браузер не имеет доступа к файловой системе сервера
файл данных по любому надо делать на сервере и класть в директорию сайта (www в твоем случае)
посмотри Умный дом, там полно про малину с удаленным управлением
Antarius
И еще, если позволите, вопрос.
А на JS есть возможность развернуть окно на весь экран, убрав все следы от браузера? А потом, допустим по нажатию на кнопку на экране вернуть обратно?
Тогда можно на малине открыть браузер и пусть она показывает собственный вебсервер. Но эстетически браузер не хочется.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB