На этом шаге мы рассмотрим реализацию этого механизма и дадим определение метапеременных.
Многие компоненты позволяют пользователю заносить в них какие-либо значения. Так, компонент поля ввода, представляемый классом Entry, служит для ввода строки текста. После того как пользователь занесет в компонент значение, его следует извлечь и обработать. Как это сделать?
Специально для этого библиотека Tkinter предусматривает так называемые метапеременные - особые сущности, предназначенные для хранения значений, которыми манипулируют компоненты. Компонент выводит на экран значение, хранящееся в метапеременной, и, наоборот, помещает в метапеременную значение, если оно было изменено пользователем.
Метапеременная библиотеки Tkinter - это экземпляр особого класса. Поддерживаются четыре класса метапеременных, хранящие значения различных типов и определенные в модуле tkinter:
Конструкторы всех этих четырех классов вызываются без параметров.
Классы метапеременных поддерживают следующие два метода:
В примере ниже приведен код приложения, которое выводит окно с полем ввода и кнопкой. При нажатии на кнопку значение, занесенное в поле ввода, выводится в Python Shell.
import tkinter import tkinter.ttk class Application(tkinter.ttk.Frame): def __init__(self, master=None): super().__init__(master) self.pack() self.create_widgets() self.master.title("Использование метапеременных") self.master.resizable(False, False) def create_widgets(self): self.varValue = tkinter.StringVar() self.varValue.set("Значение") self.entValue = tkinter.ttk.Entry(self, textvariable=self.varValue) self.entValue.pack() self.btnShow = tkinter.ttk.Button(self, text="Вывести значение", command=self.show_value) self.btnShow.pack(side="bottom") def show_value(self): print(self.varValue.get()) root = tkinter.Tk() app = Application(master=root) root.mainloop()
Результат работы приложения приведен на рисунке 1.
Рис.1. Результат работы приложения
Как уже говорилось, класс Entry представляет компонент поля ввода. Опция textvariable этого компонента служит для указания метапеременной, с которой он будет связан.
Некоторые компоненты, например Checkbutton (флажок), могут быть связаны с метапеременной любого типа. По умолчанию предполагается, что такой компонент связан с метапеременной целочисленного типа (класс intVar) - тогда в таковую будет занесено число 1, если флажок установлен, и 0, если он сброшен:
self.varState = tkinter.IntVar() # Делаем флажок изначально сброшенным, занеся в метапеременную число 0 self.varState.set(0) # Опция text указывает надпись у флажка, a variable - связанную с ним # метапеременную self.chkState = tkinter.ttk.Checkbutton(self, text="дa или нет?", variable=self.varState)
Но мы можем связать с флажком метапеременную любого другого типа, скажем, строкового (класс stringVar). Но тогда нам придется указать значения, которые будут занесены в метапеременную для установленного и сброшенного состояния флажка:
self.varState = tkinter.StringVar() # Делаем флажок изначально сброшенным, занеся в метапеременную # строку "Нет" self.varState.set("Нет") # Опция onvalue указывает значение метапеременной для установленного # состояния флажка, а опция offvalue - для сброшенного self.chkState = tkinter.ttk.Checkbutton(self, text="дa или нет?", variable=self.varState, onvalue="дa", offvalue="нет")
Более подробно о применении метапеременных для связывания компонентов с данными мы поговорим позже, когда поведем рассказ о компонентах, поддерживаемых библиотекой Tkinter.
Со следующего шага мы начнем рассматривать обработку событий.