Поэтому предлагаю потренироваться в написании небольшой графической програмки на Python с использованием tkinter (кроссплатформенная библиотека для разработки графического интерфейса на языке Python).
Код в этой статье написан для Python 3.5.
Задание: написание программы для рисования на холсте произвольного размера кругов разных цветов.
Не сложно, возможно программа «детская», но я думаю, для яркой иллюстрации того, что может tkinter самое оно.
Хочу рассказать сначала о том, как указать цвет. Конечно удобным для компьютера способом. Для этого в tkinter есть специальный инструмент, который можно запустить таким образом:
from tkinter import *
window = Tk()
colorchooser.askcolor()
Пояснения к коду:
- rom tkinter import * — импорт библиотеки, вернее всех ее методов, на что указывает звездочка (*);
- window = Tk() — создание окна tkinter;
- colorchooser.askcolor() — открывает окно выбора цвета и возвращает кортеж из двух значений: кортеж из трех элементов, интенсивность каждой RGB цвета, и строка. цвет в шестнадцатиричной системе.
Можно для определения цвета рисования использовать английские название цветов. Здесь хочу заметить, что не все они поддерживаются. Тут говорится, что без проблем вы можете использовать цвета «white», «black», «red», «green», «blue», «cyan», «yellow», «magenta». Но я все таки поэкспериментировала, и вы увидите дальше, что из этого вышло.
Для того, чтобы рисовать в Python необходимо создать холст. Для рисования используется система координат х и у, где точка (0, 0) находится в верхнем левом углу.
В общем хватит вступлений — начнем.
from random import *
from tkinter import *
size = 600
root = Tk()
canvas = Canvas(root, width=size, height=size)
canvas.pack()
diapason = 0
Пояснения к коду:
- from random import * — импорт всех методов модуля random;
- from tkinter import * — это вы уже знаете;
- переменная size понадобиться потом;
- root = Tk() — создаем окно;
- canvas = Canvas(root, width=size, height=size) — создаем холст, используя значение переменной size (вот она и понадобилась);
- canvas.pack() — указание расположить холст внутри окна;
- переменная diapason понадобиться потом для использования в условии цикла.
Дальше создаем цикл:
while diapason < 1000:
colors = choice(['aqua', 'blue', 'fuchsia', 'green', 'maroon', 'orange',
'pink', 'purple', 'red','yellow', 'violet', 'indigo', 'chartreuse', 'lime', ''#f55c4b''])
x0 = randint(0, size)
y0 = randint(0, size)
d = randint(0, size/5)
canvas.create_oval(x0, y0, x0+d, y0+d, fill=colors)
root.update()
diapason += 1
Пояснения к коду:
- while diapason < 1000: — с предусловием, которое говорит о том, что цикл будет повторятся пока переменная diapason не дойдет до 1000.
colors = choice(['aqua', 'blue', 'fuchsia', 'green', 'maroon', 'orange',
'pink', 'purple', 'red','yellow', 'violet', 'indigo', 'chartreuse', 'lime', ''#f55c4b''])
Создаем список для якобы случайного выбора цвета кругов. Заметьте, что один из цветов написан в формате ''#f55c4b'' — код цвета в шестнадцатиричной системе.
Здесь хочу остановиться на выборе цвета. Мне хотелось добавить как можно больше вариантов выбора цвета, поэтому я воспользовалась таблицей названий цветов в английском языке. Но вскоре поняла, что многие английские названия не поддерживаются — программа переставала работать. Поэтому определение цвета в шестнадцатиричной системе будет для этих целей более подходящим вариантом.
x0 = randint(0, size) и y0 = randint(0, size) — случайный выбор координат х и у в рамках холста размером size.
d randint(0, size/5) — произвольный выбор размера круга, ограниченный size/5.
canvas.create_oval(x0, y0, x0+d, y0+d, fill=colors) — собственно говоря рисуем круги, в точках с координатами x0 и y0, размерами по вертикали и горизонтали x0+d и y0+d, заливкой цветом, который выбирается случайным образом из списка colors.
root.update() — update() — обрабатывает все задачи, стоящие в очереди. Обычно эта функция используется во время «тяжёлых» расчётов, когда необходимо чтобы приложение оставалось отзывчивым на действия пользователя.
Без этого в итоге отобразятся круги, но процесс их появления будет вам не виден. А именно это придает шарм этой програмке.
diapason += 1 — шаг цикла, счетчик.
В результате получается такая картинка:
Мне не понравилось, что справа и вверху какие-то пустые места образовываются, поэтому я немного изменила условие цикла while diapason < 2000 или 3000. Так холст получился более заполненным.
Также можно сделать цикл бесконечным:
while True:
colors = choicecolors = choice(['aqua', 'blue', 'fuchsia', 'green', 'maroon', 'orange',
'pink', 'purple', 'red','yellow', 'violet', 'indigo', 'chartreuse', 'lime'])
x0 = randint(0, size)
y0 = randint(0, size)
d = randint(0, size/5)
canvas.create_oval(x0, y0, x0+d, y0+d, fill=colors )
root.update()
Вот как-то так оно происходит: instagram.com/p/8fcGynPlEc
Я думаю, можно было бы еще поиграться со скоростью рисования кругов или их движением по холсту. Можно было увеличить варианты выбора цветов. Поставить условие для остановки бесконечного цикла, например по нажатию пробела. Это все задания для будущих программ.
Студенты еще спросили, а можно ли запускать это как заставку на рабочем столе Windows? Пока не нашла как это можно было бы сделать.
Источники:
Документация по python http://www.ilnurgi1.ru/docs/python/modules/tkinter/colorchooser.html
Курс по библиотеке Tkinter языка Python
Помощники:
Введение в Tkinter http://habrahabr.ru/post/133337
Создание GUI на Python с помощью библиотеки Tkinter. Программирование для начинающих http://younglinux.info/book/export/html/48
Таблица названий цветов в английском языке http://www.falsefriends.ru/english-colors.htm
Комментарии (9)
art1415926535
09.10.2015 15:53Изменить строчки выбора позиции круга.
x0 = randint(-size/10, size)
y0 = randint(-size/10, size)
Таким образом круги будут вылезать слева и сверху. И пустоты не будет оставаться.ketrin7
09.10.2015 17:43art1415926535 отлично. Спасибо за идею. Я пробовала вместо 0 написать -3 — особо разницы не увидела, потому отказалась от этого. А до -size/10 не додумалась ;)
JIghtuse
09.10.2015 18:08В работе со студентами и учениками я заметила, что при изучении какого-либо языка программирования большой интерес вызывает работа с графикой. Даже те студенты, которые скучали на заданиях про числа Фибоначчи, и уже казалось бы у них пропадал интерес к изучению языка, активизировались на темах, связанных с графикой.
У меня примерно так было.
Когда долгое время перед глазами графические интерфейсы, а сам не представляешь себе их внутреннего устройства, они кажутся магией. Открывая своё первое окно с помощью какого-нибудь API, будто посвящаешься в тайну, которая раньше тебе была недоступна. Отчего-то приложение с окном кажется более «реальным», чем прочие. Вероятно, это следствие повсеместного распространения Windows и невозможности представить себе какие-то иные приложения/программы. Консольные helloworld'ы кажутся непонятными и странными поделками.
Успехов в начинаниях! Попробуйте посмотреть PyGame и PyGame Zero — обычно, создание игрушек ещё больше увлекает.
www.pygame.org/docs/tut/newbieguide.html
pygame-zero.readthedocs.org/en/latest
ice2heart
10.10.2015 10:10-1На одной конференции писали ради забавы похожий код(код потерялся вместе с буком).
Из интересного цвета можно выбирать из палитры, а палитру взять уже готовую, тогда картинка будет смотреться целостнее, что ли (например flat ui).ketrin7
12.10.2015 11:47ice2heart тоже думала о том, что можно не только кружочки рисовать. На счет flat ui нашла такое flatuicolors.com. Оно?
ice2heart
12.10.2015 12:24+1Да оно, там просто все цвета между собой сочетаются. Можно оттуда взять значение цветов, сложить в лист и брать случайный элемент.
kAIST
Это же обычные программы, которые обычно запускаются на полный экран, ни и предусматривают выход при нажатии на клавиши и пр:
Остается собрать с помощью py2exe и поменять расширение с EXE на SCR
ketrin7
kAIST Спасибо за совет и код. Надо будет попробовать.