В работе со студентами и учениками я заметила, что при изучении какого-либо языка программирования большой интерес вызывает работа с графикой. Даже те студенты, которые скучали на заданиях про числа Фибоначчи, и уже казалось бы у них пропадал интерес к изучению языка, активизировались на темах, связанных с графикой.

Поэтому предлагаю потренироваться в написании небольшой графической програмки на Python с использованием tkinter (кроссплатформенная библиотека для разработки графического интерфейса на языке Python).

Код в этой статье написан для Python 3.5.

Задание: написание программы для рисования на холсте произвольного размера кругов разных цветов.

Не сложно, возможно программа «детская», но я думаю, для яркой иллюстрации того, что может tkinter самое оно.

Хочу рассказать сначала о том, как указать цвет. Конечно удобным для компьютера способом. Для этого в tkinter есть специальный инструмент, который можно запустить таким образом:

from tkinter import *
window = Tk()
colorchooser.askcolor()

Пояснения к коду:

  • rom tkinter import * — импорт библиотеки, вернее всех ее методов, на что указывает звездочка (*);
  • window = Tk() — создание окна tkinter;
  • colorchooser.askcolor() — открывает окно выбора цвета и возвращает кортеж из двух значений: кортеж из трех элементов, интенсивность каждой RGB цвета, и строка. цвет в шестнадцатиричной системе.

askcolor

Можно для определения цвета рисования использовать английские название цветов. Здесь хочу заметить, что не все они поддерживаются. Тут говорится, что без проблем вы можете использовать цвета «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 — шаг цикла, счетчик.

В результате получается такая картинка:

image

Мне не понравилось, что справа и вверху какие-то пустые места образовываются, поэтому я немного изменила условие цикла 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)


  1. kAIST
    09.10.2015 14:48
    +4

    Студенты еще спросили, а можно ли запускать это как заставку на рабочем столе Windows? Пока не нашла как это можно было бы сделать.

    Это же обычные программы, которые обычно запускаются на полный экран, ни и предусматривают выход при нажатии на клавиши и пр:

    from Tkinter import *
    
    root=Tk()
    root.overrideredirect(1) # убираем заголовок окна
    root.state('zoomed')  # разворачиваем на весь экран
    
    def exit(event):root.destroy()
    
    Label(root,text='Hello world').place(relx=0.5,rely=0.5,anchor=CENTER)
    
    
    root.bind('<Button-1>',exit) # сюда еще можно добавить события нажатия на клавиши
    
    root.mainloop()
    
    
    


    Остается собрать с помощью py2exe и поменять расширение с EXE на SCR


    1. ketrin7
      09.10.2015 17:36

      kAIST Спасибо за совет и код. Надо будет попробовать.


  1. art1415926535
    09.10.2015 15:53

    Изменить строчки выбора позиции круга.

    x0 = randint(-size/10, size)
    y0 = randint(-size/10, size)

    Таким образом круги будут вылезать слева и сверху. И пустоты не будет оставаться.


    1. ketrin7
      09.10.2015 17:43

      art1415926535 отлично. Спасибо за идею. Я пробовала вместо 0 написать -3 — особо разницы не увидела, потому отказалась от этого. А до -size/10 не додумалась ;)


  1. 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


    1. ketrin7
      09.10.2015 18:14

      JIghtuse Про PyGame чиала, но пока не вникала, а про PyGame Zero и не слышала. Спасибо, покопаюсь.


  1. ice2heart
    10.10.2015 10:10
    -1

    На одной конференции писали ради забавы похожий код(код потерялся вместе с буком).
    image
    Из интересного цвета можно выбирать из палитры, а палитру взять уже готовую, тогда картинка будет смотреться целостнее, что ли (например flat ui).


    1. ketrin7
      12.10.2015 11:47

      ice2heart тоже думала о том, что можно не только кружочки рисовать. На счет flat ui нашла такое flatuicolors.com. Оно?


      1. ice2heart
        12.10.2015 12:24
        +1

        Да оно, там просто все цвета между собой сочетаются. Можно оттуда взять значение цветов, сложить в лист и брать случайный элемент.