====Методы виджетов==== ===Общее для всех виджетов=== Все виджеты в Tkinter обладают некоторыми общими свойствами. Опишем их, перед тем как перейти к рассмотрению конкретных виджетов. Виджеты создаются вызовом конструктора соответствующего класса. Первый аргумент (как правило неименованный, но можно использовать имя master) это родительский виджет, в который будет упакован (помещён) наш виджет. Родительский виджет можно не указывать, в таком случае будет использовано главное окно приложения. Далее следуют именованные аргументы, конфигурирующие виджет. Это может быть используемый шрифт (font=...), цвет виджета (bg=...), команда, выполняющаяся при активации виджета (command=...) и т.д. Полный список всех аргументов можно посмотреть в man options и man-странице соответствующего виджета (например man button, см. разделы "STANDARD OPTIONS" и "WIDGET-SPECIFIC OPTIONS"). Пример кода: from Tkinter import * def button_clicked(): print (u"Клик!") root=Tk() # кнопка по умолчанию button1 = Button() button1.pack() # кнопка с указанием родительского виджета и несколькими аргументами button2 = Button(root, bg="red", text=u"Кликни меня!", command=button_clicked) button2.pack() root.mainloop() Памятуя о Zen Python (явное лучше неявного) указываю: данный код написан и работает для Python v 2. В случае использования Python v 3 код немного изменится. 1. tkinter с маленькой буквы. 2. print в круглых скобках () и без u. ===configure, config=== Виджеты могут быть сконфигурированы во время создания, но иногда необходимо изменить конфигурацию виджета во время исполнения программы. Для этого используется метод configure (или его синоним config). Также можно использовать квадратные скобки (widget['option'] = new_value). Пример, программа выводит текущее время, после клика по кнопке: from Tkinter import * import time def button_clicked(): # изменяем текст кнопки button['text'] = time.strftime('%H:%M:%S') root=Tk() # создаём виджет button = Button(root) # конфигурируем виджет после создания button.configure(text=time.strftime('%H:%M:%S'), command=button_clicked) # также можно использовать квадратные скобки: # button['text'] = time.strftime('%H:%M:%S') # button['command'] = button_clicked button.pack() root.mainloop() В этом коде функция button_clicked вызывается каждый раз, когда пользователь кликает по кнопке. ===cget=== Метод cget является обратным к методу configure. Он предназначен для получения информации о конфигурации виджета. Здесь как и в случае с configure можно использовать квадратные скобки (value = widget['option']). Пример, после клика на кнопку программа показывает цвет кнопки и меняет его на другой: from Tkinter import * from random import random def button_clicked(): button['text'] = button['bg'] # показываем предыдущий цвет кнопки bg = '#%0x%0x%0x' % (int(random()*16), int(random()*16), int(random()*16)) button['bg'] = bg button['activebackground'] = bg root=Tk() button = Button(root, command=button_clicked) button.pack() root.mainloop() ===destroy=== Уничтожение виджета и всех его потомков. Стоит отметить, что если необходимо только на время спрятать какой-либо виджет, то лучше пользоваться упаковщиком grid и методом grid_remove: from Tkinter import * def hide_show(): if label.winfo_viewable(): label.grid_remove() else: label.grid() root=Tk() label = Label(text=u'Я здесь!') label.grid() button = Button(command=hide_show, text=u"Спрятать/показать") button.grid() root.mainloop() Использование grid_remove позволяет сохранять взаимное расположение виджетов. ===grab_=== Методы семейства grab_ предназначены для управления потоком события. Виджет, захвативший поток, будет получать все события окна или приложения. **grab_set** - передать поток данному виджету \\ **grab_set_global** - передать глобальный поток данному виджету. В этом случае все события на дисплее будут передаваться этому виджету. Следует пользоваться очень осторожно, т.к. остальные виджеты всех приложений не будут получать события. \\ **grab_release** - освободить поток \\ **grab_status** - узнать текущий статус потока событий для виджета. Возможные значения: None, "local" или "global". \\ **grab_current** - получить виджет, который получает поток \\ Пример, приложение захватывает глобальный поток и освобождает его через 10 секунд: from Tkinter import * root=Tk() root.after(200, root.grab_set_global) root.after(10000, root.grab_release) root.mainloop() ===focus_=== Методы семейства focus_ используются для управления фокусом ввода с клавиатуры. Виджет, имеющий фокус, получает все события с клавиатуры. **focus (синоним focus_set)** - передать фокус виджету. \\ **focus_force** - передать фокус, даже если приложение не имеет фокуса. Используйте осторожно, поскольку это может раздражать пользователей. \\ **focus_get** - возвращает виджет, на который направлен фокус, либо None, если такой отсутствует. \\ **focus_displayof** - возвращает виджет, на который направлен фокус на том дисплее, на котором размещён виджет, либо None, если такой отсутствует. \\ **focus_lastfor** - возвращает виджет, на который будет направлен фокус, когда окно с этим виджетом получит фокус. \\ **tk_focusNext** - возвращает виджет, который получит фокус следующим (обычно смена фокуса происходит при нажатии клавиши Tab). Порядок следования определяется последовательностью упаковки виджетов. \\ **tk_focusPrev** - то же, что и focusNext, но в обратном порядке. \\ **tk_focusFollowsMouse** - устанавливает, что виджет будет получать фокус при наведении на него мышью. Вернуть нормальное поведение достаточно сложно. \\