Главная


52. Управляющие переменные: значения, стоящие за виджетами

Управляющая переменная в Tkinter - это специальный объект, который действует как обычная переменная Python, являясь контейнером для значения, например, числа или строки.

Особенность управляющей переменной заключается в том, что она может быть общей для нескольких различных виджетов, и управляющая переменная может помнить все виджеты, которые в данный момент её используют. Это означает, в частности, что если ваша программа сохранит значение v в управляющей переменной c с помощью метода c.set(v), то все виджеты, связанные с этой управляющей переменной, автоматически обновятся на экране.

Tkinter использует управляющие переменные для ряда важных функций, например:

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

v = tk.DoubleVar()  # Хранит float;  значение по умолчанию 0.0
v = tk.IntVar()     # Хранит int;    значение по умолчанию 0
v = tk.StringVar()  # Хранит string; значение по умолчанию ''

Все управляющие переменные имеют эти два метода:

.get()

Возвращает текущее значение переменной.

.set(value)

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


Вот несколько пояснений того, как управляющие переменные используются с конкретными виджетами:

Button

Вы можете установить для ее textvariable значение StringVar. Каждый раз, когда эта переменная изменяется, текст на кнопке будет обновляться, чтобы отобразить новое значение. Это не обязательно, если текст кнопки не будет меняться: используйте атрибут text, если метка кнопки статична.

Checkbutton

Обычно вы устанавливаете параметр variable виджета в IntVar, и эта переменная будет установлена в 1, когда кнопка включена, и в 0, когда она выключена. Однако вы можете выбрать разные значения для этих двух состояний с помощью опций onvalue и offvalue соответственно.

Вы даже можете использовать StringVar в качестве переменной кнопки и указать строковые значения для offvalue и onvalue. Вот пример:

self.spamVar = tk.StringVar()
self.spamCB  = tk.Checkbutton(self, text='Spam?',
    variable=self.spamVar, onvalue='yes', offvalue='no')

Если эта кнопка включена, self.spamVar.get() вернет строку 'yes'; если кнопка выключена, тот же вызов вернет строку 'no'. Кроме того, ваша программа может включить checkbutton, вызвав .set('yes').

Вы также можете передать параметр textvariable checkbutton в StringVar. Затем вы можете изменить текстовую метку на этой кнопке, используя метод .set() для этой переменной.

Entry

Установите для параметра textvariable значение StringVar. Используйте метод .get() этой переменной, чтобы получить текст, отображаемый в данный момент в виджете. Вы также можете использовать метод переменной .set() для изменения текста, отображаемого в виджете.

Label

Вы можете установить параметр textvariable в значение StringVar. Тогда любой вызов метода переменной .set() будет изменять текст, отображаемый на метке. Это не нужно, если текст метки статичен; используйте атрибут text для меток, которые не меняются во время работы приложения.

Menubutton

Если вы хотите иметь возможность изменять текст, отображаемый на кнопке меню, установите параметр textvariable в StringVar и используйте метод .set() этой переменной для изменения отображаемого текста.

Radiobutton

Опция variable должна быть установлена на управляющую переменную, либо IntVar, либо StringVar. Все радиобаттоны в функциональной группе должны иметь одну и ту же управляющую переменную.

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

Вы можете задаться вопросом, в каком состоянии находится группа радиобаттонов, если управляющая переменная никогда не была установлена и пользователь никогда не нажимал на них? Каждая управляющая переменная имеет значение по умолчанию: 0 для IntVar, 0.0 для DoubleVar и '' для StringVar. Если один из радиобаттонов имеет такое значение value, то этот радиобаттон будет установлен в начальное положение. Если ни один из параметров value не совпадает со значением переменной, все радиокнопки будут очищены.

Если вы хотите изменить текстовую метку на радиокнопке во время выполнения вашего приложения, установите для параметра textvariable значение StringVar. Тогда ваша программа сможет изменить текстовую метку, передав новый текст метки в метод переменной .set().

Scale

Для виджета шкалы установите опцию variable в управляющую переменную любого класса, а опции from_ и to - в предельные значения для противоположных концов шкалы.

Например, вы можете использовать IntVar и установить from_=0 и to=100 для шкалы. Тогда при каждом изменении виджета пользователем значение переменной будет меняться на некоторое значение между 0 и 100 включительно.

Ваша программа также может перемещать ползунок, используя метод .set() для управляющей переменной. Продолжая пример выше, .set(75) переместит ползунок в положение, занимающее три четверти пути по желобу.

Чтобы настроить виджет шкалы для float значений, используйте DoubleVar.

В качестве управляющей переменной виджета Scale можно использовать StringVar. Вам все равно нужно будет указать числовые значения from_ и to, но числовое значение виджета будет преобразовано в строку для хранения в StringVar. Используйте опцию digits шкалы, чтобы контролировать точность преобразования.


>> Фокус: маршрутизация ввода с клавиатуры