Управляющая переменная в Tkinter - это специальный объект, который действует как обычная переменная Python, являясь контейнером для значения, например, числа или строки.
Особенность управляющей переменной заключается в том, что она может быть общей для нескольких различных виджетов, и управляющая переменная может помнить все виджеты, которые в данный момент её используют. Это означает, в частности, что если ваша программа сохранит значение v в управляющей переменной c с помощью метода c.set(v), то все виджеты, связанные с этой управляющей переменной, автоматически обновятся на экране.
Tkinter использует управляющие переменные для ряда важных функций, например:
Чекбоксы используют управляющую переменную для хранения текущего состояния кнопки (включена или выключена).
Одна управляющая переменная используется совместно группой радиобаттонов и может использоваться для определения того, какой из них установлен в данный момент. Когда пользователь нажимает на одну кнопку в группе, совместное использование этой управляющей переменной является механизмом, с помощью которого Tkinter группирует кнопки таким образом, что при установке одной из них все остальные установленные кнопки в группе очищаются.
Управляющие переменные хранят текстовую строку для нескольких приложений. Обычно текст, отображаемый в виджете Entry, связан с управляющей переменной. В некоторых других элементах управления можно использовать управляющую переменную со строковым значением для хранения текста, например, меток чекбоксов и радиобаттонов, а также содержимого виджетов Label.
Например, можно связать виджет Entry с виджетом Label, чтобы, когда пользователь изменит текст в Entry и нажмет клавишу <Enter>, метка Label автоматически обновилась и отобразила тот же текст.
Чтобы получить управляющую переменную, используйте один из этих конструкторов класса, в зависимости от того, какой тип значений вам нужно в ней хранить:
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').
Вы также можете передать параметр
textvariablecheckbutton в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шкалы, чтобы контролировать точность преобразования.