﻿# -*- coding: utf-8 -*-
import Tkinter
# еще до создания переменных Tk должно быть создано корневое окно
root = Tkinter.Tk()

# создается строковая переменная Tk
myVar = Tkinter.StringVar()

# определяется функция обратного вызова, описывающая свои аргументы на входе
# и изменяющая значение переменной
def callbackFunc(name, index, mode):
  print "callback called with name=%r, index=%r, mode=%r" % (name, index, mode)
  varValue = root.getvar(name)
  print "    and variable value = %r" % varValue
  # изменяет значение, чтобы показать, что это может быть сделано
  root.setvar(name, varValue + " modified by %r callback" % (mode,))

# создается отслеживание для записи и чтения;
# возвращаемые имена сохраняются для последующего удаления отслеживания
wCallbackName = myVar.trace_variable('w', callbackFunc)
rCallbackname = myVar.trace_variable('r', callbackFunc)

# задает значение, запуская обратный вызов записи
myVar.set("first value")

# получает значение, запуская обратный вызов считывания, и затем выводит значение на экран;
# при этом в выражении для печати нового получения значения не происходит,
# потому что тогда выход с выражения для печати и после обратного вызова
# перемешается, создавая путаницу
varValue = myVar.get() # запуск обратного вызова считывания
print "after first set, myVar =", varValue

# снова происходит задание и получение значения для демонстрации того, 
# что отслеживающие обратные вызовы еще существуют
myVar.set("second value")
varValue = myVar.get() # запуск обратного вызова получения значения
print "after second set, myVar =", varValue

# удаляем обратный вызов при записи и еще раз проводим задание и получение значения
myVar.trace_vdelete('w', wCallbackName)
myVar.set("third value")
varValue = myVar.get() # запуск обратного вызова считывания
print "after third set, myVar =", varValue
root.mainloop()