Найти - Пользователи
Полная версия: Начинает тормозить TKinter
Начало » GUI » Начинает тормозить TKinter
1 2 3 4 5 6 7
Antarius
Здравствуйте.
Я новичек, и ни разу не программист, но вот приспичило написать графический интерфейс для прибора.
Так сказать прибор - малина, на которой крутится распибиан, на ней питон, в питоне с цикличностью раз в 30 секунд считываются по I2C данные от датчика.
Данные вносятся в массив, массив сдвигается на одну позицию каждое считываение и так по кругу.
В общем, обычный детский сад, почти метеостанция с bmp280, как многие делают.

На дисплее TKinterом во все окно рисуется морда, на которой отображется график из массива.
График рисуется canv.create_line(….) кусочками, соединяя соседние данные из массива.
Перед новой итерацией делается canv.delete('all') и по новой рисуется график.
График появляется мгновенно, все хорошо.
Но так работает примерно часа два. Потом начинаются тормоза - график начинает медленно отрисовываться, кривая медленно ползет слева направо.

Как это пообороть?
Предлагать не TKinter не нужно, т.к. на его изучение потрачено время и другое изучать некогда и не хочется.
Может есть способ нарисовать как-то в память, а потом мгновенно все отобразить, чтобы от пользователя был скрыт процесс рисования.
Спасибо.


FishHook
Antarius
Предлагать не TKinter не нужно
А я все-таки предложу. Прикол в том, что у питона есть либа для рисования графиков, там разобраться не проблема
http://matplotlib.org
Antarius
Спасибо.
Я смотрел эту либу. И оставил ее на крайний случай.
Не верю я, что нарисовать график из 600 точек - это более тяжелая задача, чем взлететь матплоту со всеми свистоперделками в нем.
Да и я на ткинтере все написал сам, и масштабирование, и оси и подписи, и значения и экстремумы и прочее. И даже красивее,чем в матплоте…. Но тупиииит, зараза. Помогите!

ЗЫ.
В 1996 году я изучал qbasic в школе, и на контрольных рисовал какие-то графики по массивам. И на олимипиадах на паскале чет писал подобное. И оно не тупило, по крайней мере не раздражало.
Прошло каких-то 20 лет… те же задачи, гигарцы вычислительной мощности в утюгах - и чет я разочарован… Или дело в питоне, или руки кривые.
Antarius
В догонку воспрос. Решил изменение графика сделать не удалением всех объектов, и отрисовкой новых за каждую итерацию, а присвоить tags всем линиям и надписям и каждую итерацию их менять под новые данные, благо количество и примерное положение почти не изменяется.

Вопрос.
Допустим, я создал надпись
canv.create_text(10,10, text = ‘blablabla’, fill = “gray”, tags = ‘blatext’)

Затем я хочу переместить эту надпись и изменить текст

canv.coords('blatext', 15,15)
canv.itemconfig('blatext', text = ‘ myaoo’)

Вопрос - а почему от старой надписи остаются следы?

FishHook
Antarius
Или дело в питоне, или руки кривые.
Понимаете в чем дело, Tkinter - это питонья обертка над графическим тулкитом Tk, которому лет не меньше чем квик-бэйсику. Причины по которым его вообще еще используют - это относительная простота и портирование на кучу платформ (ну и личная привязанность Гвидо, разумеется). В стандартную библиотеку питона его включают еще и ввиду мизерного объема - жрать не просит. Не ждите от Tkinter особых возможностей и современных фич - их там нет.
vic57
Antarius
Может есть способ нарисовать как-то в память, а потом мгновенно все отобразить, чтобы от пользователя был скрыт процесс рисования.
Спасибо.
PIL
Antarius
Спасибо, не знал про PIL, посмотрю.
Подскажите еще по ткинтеру, чем отличается
canv.update()
от
canv.update_idletasks()
?

И зачем вообще нужен update, если и без него все рисуется?
Извините за нубские вопросы.
Спасибо.

4kpt_IV
update нужен когда происходит процесс и должен измениться интерфейс. Сам он не знает, что его состояние изменилось. Ну и циклические операции изменения. Во втором случае изменения произойдут только после завершения цикла. Если же нужно, чтобы изменения происходили поэтапно с каждым шагом цикла, тогда нужно вставлять update. Фактически это связано с передачей управления, но это Вам пока не нужно.

update_idletasks служит для получения размеров отдельных элементов. Так как после запуска команды отрисовка отдается на откуп графической системе, то ни о каких размерах речи быть не может (до отрисовки). Мало того, есть механизмы “растягивания” и “сжатия”, которые также заранее просчитать невозможно. В этом случае, когда возникает необходимость получения размеров без использования update_idletasks Вы получите “1х1+0+0”, поэтому необходимо предварительно вызывать этот метод.

P.S. Есть хорошая документация. Там это все написано
Antarius
К сожалению, чтобы легко читать и понимать такую документацию, надо быть программистом и читать ее каждый день. А когда твой уровень - найти онлайн учебник по ткинтеру, в котором “сейчас мы изучим ткинтер. рисуем кружочек. получилось? вау! а теперь квадратик! вы можете сделать с ними все что угодно, сами разберетесь, есть документация. Ура, мы изучили ткинтер”, то несколько трудновато.
Но да, это мои проблемы
4kpt_IV
Мне кажется мы говорим про разную документацию.
Я имею ввиду эту.
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