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

зачем нам это нужно?

А для того что мы можем помимо манипуляцией одним объектом можем управлять всем что происходит на форме. Но для этого нам надо создать еще одну функцию которая будет отвечать за отрисовку всего.

В python есть возможность добавлять специальный контролеры, которые позволяю вводить числа, можно добавлять кнопки. Есть еще такая прикольная компонента которая называется Scale, с помощью нее можно выбирать значение мышью.

Давайте добавим Scale себе на форму:

собственно, у него три главных параметра

  • from_ – начальное значение
  • to – конечное значение
  • orient – ориентация в пространстве, может быть вертикальный, а может быть горизонтальный

функция slider.pack() размещает слайдер на форме. Можно запустить и проверить

самое прикольное? что вы можете добавить реакцию на изменение значения слайдера.

Например можем попробовать вызывать функцию draw_all() при сдвиге слайдера. Для этого надо добавить четвертый параметр в Scale

если теперь запустить и попробовать подвигать ползунок, то увидим ошибки

дело в том, что в command надо передать функцию которая принимает один параметр. А у draw_all нет параметров. Поэтому имеет смысл создать еще одну функцию которая будет вызывать draw_all.

Вот так:

можно еще посмотреть, что попадает в этот самый value:

def on_scale_change(value):
    print(value) # добавил value
    draw_all()

мы можем попробовать использовать это значение чтобы двигать объекты на форме. Попробуем передать значение в функцию

запускаем:

хм, ну вроде с одной стороны прикольно, а с другой какие-то артефакты.

Дело в том, что когда мы вызываем draw_all мы как бы рисуем поверх предыдущего нарисованного изображения.

И в общем чтобы наше предыдущее изображение не мешало новому, нам надо очищать канву для рисования.

Для это его специальная функция delete, добавим ее в начало draw_all

запускаем:

красота! =)

Задание

Добавть Scale для управления положением солнца на форме

для того чтобы слайдер занимал всю ширину передайте параметры методы pack

s.pack(fill=BOTH, expand=True, pady=10)