Как без использования Tkinter и pywin32 создать карту мыслей, работающую на Win и Ubuntu.
Использовались: Python 2.6, Pygame 1.9.1, Scite 3.2.5 99ru.
Проверено на winXP, Ubuntu 10.04.
Началась история с того, как я впервые познакомился с классом программ «карты мыслей» и они меня сильно заинтересовали. Я увидел множество возможностей в них, большое пространство для творчества.
Для начала понадобились компоненты «текстовое поле» и «кнопка».
Вместо того чтобы использовать Tkinter я написал немного кода, с использованием Pygame.
Что требуется для кнопки? Для начала — немного: нарисовать прямоугольник с текстом и способ получить его ID при наведении курсора или нажатии кнопки мыши. Я не стал делать слушатель событий для каждой кнопки, как во флеше, так как чем больше кнопок или других компонентов, тем больше слушателей будет, и все они одинаковые. И я сделал по-другому.
Составил список прямоугольников чтобы проверять их на пересечение с точкой, в которой мы делаем клик. Чтобы не проверять все прямоугольники, разделил сцену на ячейки по 64 пикселя.
Затем нужно получить координаты ячейки, в которой кликнули и проверить список прямоугольников на пересечение с точкой клика. А при создании объекта заносить его ИД в ячейки карты, которые он занимает.
Карту ячеек я реализовал на основе словаря, который хранит только непустые ячейки карты.
При обновлении сцены нужно получить объекты, видимые на экране, перебирая все ячейки экрана, благодаря чему становится известно, что края объекта будут видны на экране и поэтому объект нужно нарисовать.
Дальше мне понадобилась форма открытия и сохранения файла. Я также не стал использовать для этого Pywin32, но снова нарисовал всё сам.
Пока что форма работает с деревом каталогов в пределах текущего диска, что может подойти для *nix но недостаточно для win.
Также интересно было разбираться с буфером обмена.
Pygame использует pygame.scrap для работы с буфером. Текст, скопированный извне, приходит с типом
на который нужно проверить при помощи
и выполнить нужные действия. Но чтобы вывести текст в консоль или внести строку из программы в буфер, нужно почему-то кодировать и раскодировать при помощи
На данный момент реализовано далеко не всё что хотелось, но базовая функциональность уже есть. Конечно, немного стыдно за свой код, из-за этого я долго думал, перед тем как выкладывать его на всеобщее обозрение, но ждать больше нельзя.
Пока не могу понять почему в полноэкранном режиме создание поверхностей для текста занимает больше времени.
Выделение текста работает через поиск ширины строк, а для этого нужно создать поверхность, что занимает время.
Поэтому, если кому-нибудь интересно, добро пожаловать на Гитхаб, проект yamindmap
PS. Когда запустил код на Ubuntu под Vbox, он чудесным образом заработал, хотя я уверен, что есть проблемы с разрешениями на запись файлов.
Использовались: Python 2.6, Pygame 1.9.1, Scite 3.2.5 99ru.
Проверено на winXP, Ubuntu 10.04.
Началась история с того, как я впервые познакомился с классом программ «карты мыслей» и они меня сильно заинтересовали. Я увидел множество возможностей в них, большое пространство для творчества.
Для начала понадобились компоненты «текстовое поле» и «кнопка».
Вместо того чтобы использовать Tkinter я написал немного кода, с использованием Pygame.
Что требуется для кнопки? Для начала — немного: нарисовать прямоугольник с текстом и способ получить его ID при наведении курсора или нажатии кнопки мыши. Я не стал делать слушатель событий для каждой кнопки, как во флеше, так как чем больше кнопок или других компонентов, тем больше слушателей будет, и все они одинаковые. И я сделал по-другому.
Составил список прямоугольников чтобы проверять их на пересечение с точкой, в которой мы делаем клик. Чтобы не проверять все прямоугольники, разделил сцену на ячейки по 64 пикселя.
Затем нужно получить координаты ячейки, в которой кликнули и проверить список прямоугольников на пересечение с точкой клика. А при создании объекта заносить его ИД в ячейки карты, которые он занимает.
Карту ячеек я реализовал на основе словаря, который хранит только непустые ячейки карты.
При обновлении сцены нужно получить объекты, видимые на экране, перебирая все ячейки экрана, благодаря чему становится известно, что края объекта будут видны на экране и поэтому объект нужно нарисовать.
Дальше мне понадобилась форма открытия и сохранения файла. Я также не стал использовать для этого Pywin32, но снова нарисовал всё сам.
Пока что форма работает с деревом каталогов в пределах текущего диска, что может подойти для *nix но недостаточно для win.
Также интересно было разбираться с буфером обмена.
Pygame использует pygame.scrap для работы с буфером. Текст, скопированный извне, приходит с типом
«text/plain;charset=utf-8»
на который нужно проверить при помощи
if pygame.scrap.contains («text/plain;charset=utf-8») :
pass
и выполнить нужные действия. Но чтобы вывести текст в консоль или внести строку из программы в буфер, нужно почему-то кодировать и раскодировать при помощи
text=text.decode("utf-16")
На данный момент реализовано далеко не всё что хотелось, но базовая функциональность уже есть. Конечно, немного стыдно за свой код, из-за этого я долго думал, перед тем как выкладывать его на всеобщее обозрение, но ждать больше нельзя.
Пока не могу понять почему в полноэкранном режиме создание поверхностей для текста занимает больше времени.
Выделение текста работает через поиск ширины строк, а для этого нужно создать поверхность, что занимает время.
Поэтому, если кому-нибудь интересно, добро пожаловать на Гитхаб, проект yamindmap
PS. Когда запустил код на Ubuntu под Vbox, он чудесным образом заработал, хотя я уверен, что есть проблемы с разрешениями на запись файлов.