Библиотека Tkinter содержит специальные классы, объекты которых выполняют роль переменных для хранения значений о состоянии различных виджет. Изменение значения такой переменной ведет к изменению и свойства виджета, и наоборот: изменение свойства виджета изменяет значение ассоциированной переменной.
Существует несколько таких классов Tkinter, предназначенных для обработки данных разных типов.
Пример 1.
Во втором уроке мы уже использовали переменную-объект типа IntVar() при создании группы радиокнопок:
var=IntVar() var.set(1) rad0 = Radiobutton(root,text="Первая",variable=var,value=0) rad1 = Radiobutton(root,text="Вторая",variable=var,value=1) rad2 = Radiobutton(root,text="Третья",variable=var,value=2)
Здесь создается объект класса IntVar и связывается с переменной var. С помощью метода set устанавливается начальное значение, равное 1. Три радиокнопки относятся к одной группе: об этом свидетельствует одинаковое значение опции (свойства) variable. Variable предназначена для связывания переменной Tkinter с радиокнопкой. Опция value определяет значение, которое будет передано переменной, если данная кнопка будет в состоянии "включено". Если в процессе выполнения скрипта значение переменной var будет изменено, то это отразится на группе кнопок. Например, это делается во второй строчке кода: включена кнопка rad1.
Если метод set позволяет устанавливать значения переменных, то метод get, наоборот, позволяет получать (узнавать) значения для последующего их использования.
def display(event): v = var.get() if v == 0: print ("Включена первая кнопка") elif v == 1: print ("Включена вторая кнопка") elif v == 2: print ("Включена третья кнопка") but = Button(root,text="Получить значение") but.bind('<Button-1>',display)
При вызове функции display в переменную v “записывается“ значение, связанное в текущий момент с переменной var. Чтобы получить значение переменной var, используется метод get (вторая строчка кода).
Пример 2.
Несколько сложнее обстоит дело с флажками. Поскольку состояния флажков независимы друг друга, то для каждого должна быть введена собственная ассоциированная переменная-объект.
from tkinter import * root = Tk() var0=StringVar() # значение каждого флажка ... var1=StringVar() # ... хранится в собственной переменной var2=StringVar() # если флажок установлен, то в ассоциированную переменную ... # ...(var0,var1 или var2) заносится значение onvalue, ... # ...если флажок снят, то - offvalue. ch0 = Checkbutton(root,text="Окружность",variable=var0, onvalue="circle",offvalue="-") ch1 = Checkbutton(root,text="Квадрат",variable=var1, onvalue="square",offvalue="-") ch2 = Checkbutton(root,text="Треугольник",variable=var2, onvalue="triangle",offvalue="-") lis = Listbox(root,height=3) def result(event): v0 = var0.get() v1 = var1.get() v2 = var2.get() l = [v0,v1,v2] # значения переменных заносятся в список lis.delete(0,2) # предыдущее содержимое удаляется из Listbox for v in l: # содержимое списка l последовательно ... lis.insert(END,v) # ...вставляется в Listbox but = Button(root,text="Получить значения") but.bind('<Button-1>',result) ch0.deselect()# "по умолчанию" флажки сняты ch1.deselect() ch2.deselect() ch0.pack() ch1.pack() ch2.pack() but.pack() lis.pack() root.mainloop()
Помимо свойства (опции) variable, связывающей виджет с переменной-объектом Tkinter (IntVar, StringVar и др.), у многих виджет существует опция textvariable, которая определяет текст-содержимое или текст-надпись виджета. Несмотря на то, что «текстовое свойство» может быть установлено для виджета и изменено в процессе выполнения кода без использования ассоциированных переменных, иногда такой способ изменения оказывается более удобным.
from tkinter import * root = Tk() v = StringVar() ent1 = Entry (root, textvariable = v,bg="black",fg="white") ent2 = Entry(root, textvariable = v) ent1.pack() ent2.pack() root.mainloop()
Здесь содержимое одного текстового поля немедленно, отображается в другом, т.к. оба поля привязаны к одной и той же переменной v.