Шаг 4.
Библиотека Tkinter.
Связывание компонентов с данными. Метапеременные

    На этом шаге мы рассмотрим реализацию этого механизма и дадим определение метапеременных.

    Многие компоненты позволяют пользователю заносить в них какие-либо значения. Так, компонент поля ввода, представляемый классом 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.

    Со следующего шага мы начнем рассматривать обработку событий.




Предыдущий шаг Содержание Следующий шаг