Как можно догадаться, ползунки предлагают различные способы обработки своих значений: непосредственно в обработчике события перемещения или позже, путем получения текущего положения через переменные или вызовы методов. В действительности переменные tkinter вообще не нужны для программирования ползунков — достаточно зарегистрировать обработчик события перемещения или вызывать метод get ползунка, чтобы при необходимости получать значение шкалы, как показано в более простом примере 8.31.
Пример 8.31. PP4E\Gui\Tour\demo-scale-simple.py
from tkinter import *
root = Tk()
scl = Scale(root, from_=-100, to=100, tickinterval=50, resolution=10) scl.pack(expand=YES, fill=Y)
def report():
print(scl.get())
Button(root, text=’state’, command=report).pack(side=RIGHT) root.mainloop()
На рис. 8.31 изображены два экземпляра этой программы, запущенные в Windows, окно одной из них растянуто, а другой — нет (ползунки
Рис. 8.31. Простая шкала без переменных
настроены так, чтобы они растягивались по вертикали). Шкала имеет диапазон значений от -100 до 100, использует параметр resolution для изменения текущей позиции на 10 единиц вверх или вниз при каждом перемещении, а параметр tickinterval установлен так, чтобы рядом со шкалой отображались метки с шагом 50. Если щелкнуть на кнопке State в окне этого сценария, будет вызван метод get шкалы для получения и вывода текущего значения без всяких переменных или обратных вызовов:
C:\…\PP4E\Gui\Tour> python demo-scale-simple.py 0 60
-70
Честно говоря, единственный повод использовать переменные tkinter в сценарии demoScale — это синхронизация шкал. Чтобы сделать пример более интересным, в этом сценарии один и тот же объект переменной tkinter связан с обеими шкалами. Как было показано в предыдущем разделе, изменение состояния виджета влечет за собой изменение его переменной, а изменение переменной изменяет состояние всех связанных с ней виджетов. Другими словами, это означает, что перемещение ползунка обновляет переменную, которая, в свою очередь, может обновить все другие виджеты, связанные с той же переменной. Так как в этом сценарии одна переменная связана с двумя шкалами, они автоматически становятся синхронизированными: перемещение одного ползунка вызывает перемещение другого, потому что при этом изменяется совместно используемая переменная, побочным эффектом чего является обновление другого ползунка.
Ваши приложения могут использовать или не использовать подобный прием синхронизации ползунков (граничащий с глубокой магией), но если задуматься, то это очень мощное средство. Связывая несколько виджетов с помощью переменных tkinter, можно автоматически синхронизировать их и избежать необходимости вручную корректировать значения виджетов в обработчиках событий. С другой стороны, синхронизацию можно обеспечить и без совместно используемой переменной, вызывая метод set одного ползунка из обработчика другого. Такое изменение вручную я оставляю читателю в качестве самостоятельного упражнения. Что для одного глубокая магия, для другого может оказаться привычной рутиной.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011