Введение в Python - [16]

Шрифт
Интервал

>| seven_btn.grid(row=1, column=4)

>

>| ten_btn = Button(self, text="Twenty", width=10)

>| ten_btn.grid(row=1, column=5)

>|

>| twenty_btn = Button(self, text="Fifty", width=10)

>| twenty_btn.grid(row=1, column=6, sticky=W)


Не забудьте добавить вызов этого метода в __init__, чтобы все работало.


>self.setUI()


Если вы сделали все верно, то при запуске всего кода вы увидите следующее окно:

Теперь создадим метод рисования на холсте. Для начала создадим переменные класса устанавливающие размер и цвет кисти, в метод __init__ допишите:


>self.brush_size = 10self.brush_color = "black"


Сам метод рисования будет выглядеть следующим образом:


>1 | def draw(self, event):

>2 | self.canv.create_oval(event.x - self.brush_size,

>3 | event.y - self.brush_size,

>4 | event.x + self.brush_size,

>5 | event.y + self.brush_size,

>6 | fill=self.color, outline=self.color)


Рисование осуществляется путем создания кругов на холсте: пользователь зажимает левую кнопку мыши и при движении мышью, по пути следования курсора будут отрисовываться круги. Метод draw принимает аргумент event, на основе которого мы будем формировать овалы. Метод create_oval класса Canvas получает четыре координаты, на основе которых создается квадрат, в который вписывается круг. В качестве этих координат мы передаем позицию курсора, поэтому первая координата по оси икс будет позиция курсора минус размер кисти, вторая координата по оси икс - позиция курсора плюс размер кисти, то же самое для оси игрек. Это может показаться сложным, но скоро вы запустите наше приложение и увидите все своими глазами.

Осталось только привязать к канвасу обработку только что созданного метода. Добавьте следую строку после прикрепления канваса (self.canvas.grid...)


>self.canv.bind("", self.draw)


означает "при движении зажатой левой кнопки мыши" вызывать метод draw. Теперь мы можем рисовать!

Уже выглядит неплохо. Добавим возможность изменять цвет кисти, заставим кнопки верхнего ряда работать. Для этого сначала создадим метод изменения цвета кисти:


>| def set_color(self, new_color):

>| self.color = new_color


После этого в каждой кнопке верхнего ряда следует добавить код обработки нажатия этой кнопки по следующему шаблону:


>| red_btn = Button(self, text="Red", width=10, command=lambda: self.set_color("red"))

>| red_btn.grid(row=0, column=1)


Код который мы добавили - command = lambda: self.set_color("red"), привязывает функцию с нужным нам аргументом к кнопке. Мы используем lambda-функцию потому-что, без lambda функция вызовется сразу при создании кнопки, а не только при ее нажатии. (Можете попробовать такую строку command = self.set_color("red") и цвет сразу установится на красный). Добавив этот код с нужными аргументами (а это "green", "blue", "black", "white") ко всем кнопкам получим возможность изменять цвет кисти:


Теперь добавим метод изменения размера кисти:


>| def set_brush_size(self, new_size):

>| self.brush_size = new_size


И модернизируем код каждой кнопки нижнего ряда по следующему шаблону:


>one_btn = Button(self, text="Two", width=10, command=lambda: self.set_brush_size(2))


Логика работы этих кнопок та же, что и у кнопок изменения цвета кисти. Получаем следующий результат:

На этом практически все, осталось добавить функционал очистки холста. Мы оставили место в верхнем ряду кнопок, его и заполним. Добавьте следующий код в наш метод setUI:

>| clear_btn = Button(self, text="Clear all", width=10, command=lambda: self.canv.delete("all"))

>| clear_btn.grid(row=0, column=6, sticky=W)

Для очистки холста мы используем метод delete класса Canvas, чтобы удалить все с холста в качестве аргумента методу delete мы передаем "all". Вот и все, у нас есть примитивный Paint.

P.S.: Запустив данное приложение, вы заметите, что если провести мышкой быстро, то линии у нас получаются прерывчастыми. Это вызвано тем, что движение происходит быстрее, чем завершается очередной цикл root.mainloop, соответственно все, что попадает "между" итерациями цикла пропадает. Решение этой проблемы само по себе достаточно интересное задание, однако оно требует намного более сложного кода.

P.P.S: Исходный код проекта на GitHub (https://github.com/g0t0wasd/python/blob/master/programs/gui/PyPaint.py)

Об авторе



Всем привет! Меня зовут Дмитрий Красота, я ведущий программист, сертифицированный Python-cпециалист.


О себе.

Изначально программирование было просто хобби. Еще в школе я баловался с JavaScript, потом прочел пару книг по С++. Как и многие хотел написать собственную игру. Конечно, до тех пор, пока я не узнал о языке программирования Python это были только фантазии. Постепенно совершенствуясь и открывая новые источники информации, я все больше и больше стал склоняться к выбору профессии программиста, разработчика на Python.


О блоге. (http://pythonicway.com)

Основная проблема, с которой я сталкивался когда был еще школьником это отсутствие качественного обучающего материала по программированию. Обидно, ведь тема благодатная и прибыльная, многие известные люди называют программирование - грамотностью 21 века. Так же как умение читать в 18 веке давало значительное преимущество перед остальными людьми, так и умение программировать сегодня это в значительной мере залог успешной и благополучной жизни (ни для кого не секрет сколько сегодня получают программисты). И тем не менее информация в книгах достаточно ограниченая, скудная, лишенная наглядных примеров.


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


Фундаментальные алгоритмы и структуры данных в Delphi

Книга "Фундаментальные алгоритмы и структуры данных в Delphi" представляет собой уникальное учебное и справочное пособие по наиболее распространенным алгоритмам манипулирования данными, которые зарекомендовали себя как надежные и проверенные многими поколениями программистов. По данным журнала "Delphi Informant" за 2002 год, эта книга была признана сообществом разработчиков прикладных приложений на Delphi как «самая лучшая книга по практическому применению всех версий Delphi».В книге подробно рассматриваются базовые понятия алгоритмов и основополагающие структуры данных, алгоритмы сортировки, поиска, хеширования, синтаксического разбора, сжатия данных, а также многие другие темы, тесно связанные с прикладным программированием.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.


Как пасти котов. Наставление для программистов, руководящих другими программистами

«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.