разработка скриптов
Вы не зашли.
Полную документацию на английском языке вы можете найти на официальном сайте Python: http://docs.python.org/lib/tkinter.html.
Полезные ссылки: An Introduction to Tkinter, Школа Python/Tk. Одно из лучших руководств по Tkinter: Tkinter reference: a GUI for Python от New Mexico Tech. Это руководство довольно легко найти в Интернете и в PDF.
Примеры здесь будут приводиться для Linux, но, чаще всего, они могут быть довольно легко перенесены и на Windows.
Библиотека Tkinter предоставляет средства разработки графического пользовательского интерфейса (GUI - Grafical User Interface) и издавна входит в стандартный дистрибутив Python. При установке Python вы, скорее всего, получаете полностью готовую к использованию библиотеку. Tkinter - очень простая в освоении библиотека, однако она имеет ограниченный набор возможностей и характеризируется относительно невысоким быстродействием (из-за двойной интерпретации: сначала в Python, затем в Tcl/Tk).
Hello, World!
#!/usr/bin/python # -*- coding: utf-8 -*- from Tkinter import * MainWindow = Tk() label = Label(MainWindow, text=u'Привет, библиотека Tk!') label.config(height=20, width=50) label.pack(expand=YES, fill=BOTH) MainWindow.mainloop()
Порядок исполнения программы построчно:
1. Импортируются все имена из модуля Tkinter.
2. Создаётся главное (родительское, корневое) окно.
3. Создаётся элемент управления Label (надпись) в главном окне, при создании задаётся текст надписи.
4. Устанавливаются размеры элемента Label с помощью вызова метода config. Метод config (синоним configure) можно вызвать в любой момент после создания графического элемента, чтобы на лету изменить его внешний вид.
5. Устанавливаются параметры расположения элемента Label в родительском контейнере, т.е. элемент упаковывается.
6. Отображается главное окно и запускается цикл его событий.
Метод pack() какого-либо графического элемента вызывает менеджер геометрии - упаковщик (packer). Менеджер геометрии pack - не единственный менеджер геометрии в Tkinter. Менеджер геометрии организует расположение одного графического элемента в другом (который является контейнером, родителем или хозяином данного графического элемента).
Опции метода pack():
side - Возможные значения: TOP, BOTTOM, LEFT, RIGHT. Размещает элемент у соответствующего края контейнера.
expand - Возможные значения: YES, NO. Если YES, пространство, выделяемое элементу, занимает всё свободное место в контейнере.
fill - Определяет растяжение элемента, чтобы он занял всё выделенное ему пространство. Возможные значения: X (растягивать по горихонтали), Y (растягивать по вертикали), BOTH (растягивать в обе стороны). Применяется после side и expand.
anchor - Определяет размещение элемента в отведённой для него области. Возможные значения (восемь сторон света): N, NE, E, SE, S, SW, W, NW или CENTER. Применяется после side и expand.
after - Определяет размещение элемента после указанного "братского" элемента в контейнере. Значение - имя элемента. Меняет порядок упаковки элементов.
before - Определяет размещение элемента перед указанным "братским" элементом в контейнере. Значение - имя элемента. Меняет порядок упаковки элементов.
in - Определяет родительский контейнер. Значение - имя контейнера (окна).
ipadx, ipady - Определяют внутреннее поле элемента по горизонтали и вертикали в экранных единицах измерения, расширяя область, занимаемую элементом.
padx, pady - Определяют внешнее поле элемента (за обрамлением) по горизонтали и вертикали в экранных единицах измерения, расширяя область, занимаемую элементом. Значение может представлять список из двух элементов для задания ассиметричных полей.
Tkinter запоминает порядок упаковки - элементы, упакованные последними, обрезаются при уменьшении размеров контейнера раньше. Технически после изменения размеров контейнера шаги упаковки просто выполняются заново.
Неактивен
Некоторые часто используемые события в Tkinter:
Activate
Данное окно или графический объект становятся активными.
ButtonPress
Button
Нажатие любой кнопки мыши.
Нажатие первой кнопки мыши - Button-1, других кнопок - аналогично.
Double-Button-1 - двойной щелчок первой кнопкой мыши.
Triple-Button-1 - тройной щелчок первой кнопкой мыши.
ButtonRelease
Отпускание кнопки мыши.
Configure
Виджет изменил размеры или положение (размеры находятся в свойствах width и height объекта события).
Deactivate
Данное окно или графический объект перестают быть активными.
Destroy
Данный графический объект назначен для удаления (закрытие окна).
Enter
Указатель мыши пересек границы данного окна или графического объекта (оказался над объектом).
Focusln
Данный графический объект получил фокус.
FocusOut
Данный графический объект потерял фокус.
KeyPress
Key
Нажатие любой клавиши.
Кеу-а - нажатие клавиши "а" и т.д.
KeyRelease
Отпускание клавиши.
Leave
Указатель мыши вышел за границы данного окна или графического объекта.
Motion
Перемещение указателя мыши.
MouseWheel
Прокрутка колеса мыши.
Visibility
Изменился вид отображения окна: свёрнуто, восстановлено и т.д.
Чтобы программа реагировала на событие, нужно зарегистрировать его и написать функцию обработки события. Если какое-либо событие не будет зарегистрировано в программе, такое событие пройдёт для программы незамеченным. Чтобы зарегистрировать событие, сначала нужно создать соответствующий графический объект (widget - "виджет", дословно "штучка"). Под графическими объектами понимают окна, снабжённые специальными свойствами. Примерами таких графических объектов могут быть кнопки, текстовые поля, меню, полосы прокрутки и т.д. Пример с кнопкой:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
# функция обработки события для кнопки
def die(event):
root.destroy() # уничтожаем родителькое окно, и вместе с тем выходим из цикла его событий
root = Tk() # создаётся главное окно
button = Button(root) # создаётся кнопка в главном окне
button["text"] = u"Завершение работы" # объект кнопки обрабатывается как словарь
button.bind("<Button-1>", die) # регистрация события нажатия первой кнопки мыши
# первый строковый параметр задаёт имя события
# второй параметр указывает имя функции обработки события,
# которая может принимать единственный параметр — event (событие)
# есть альтернативный способ определения функции обработки события:
# button["command"] = die
# при таком подходе параметр event в функции обработки события
# никогда не используется (и не должен быть указан в описании самой функции)
button.pack() # элемент упаковывается в родительском контейнере
root.mainloop() # запуск главного окна и цикла его событийПримеры описаний событий строками:
* "<ButtonPress-3>" или просто "<3>" - щелчок правой кнопки мыши.
* "<Shift-Double-Button-1>" - двойной щелчок мышью (левой кнопкой) с нажатой кнопкой Shift.
* "<KeyPress-k>" или просто "<k>" - нажатие клавиши "k" в английской раскладке.
* "<KeyPress-ё>" или просто "<ё>" - нажатие клавиши "ё" в русской раскладке.
* "<Double-ё>" - двойное нажатие клавиши "ё" в русской раскладке.
Примеры модификаторов: Control, Shift, Alt, Double, Triple.
Для неалфавитно-цифровых клавиш есть специальные названия: Cancel, BackSpace, Tab, Return, Shift_L, Control_L, Alt_L, Pause, Caps_Lock, Escape, Prior (PageUp), Next (PageDown), End, Home, Left, Up, Right, Down, Print, Insert, Delete, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, Num_Lock, Scroll_Lock, space (пробел), less ("меньше"). Следует заметить, что Shift_L, в отличие от Shift, нельзя использовать как модификатор.
Комбинации, означающие что-то особенное в системе, могут не дойти до приложения. Например, Ctrl-Alt-Del.
Следующий скрипт отображает направляемые виджету события нажатий различных клавиш:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
tk = Tk()
txt = Text(tk)
txt.pack()
def event_info(event):
txt.delete("1.0", END) # очистка с начала до конца текста
for k in dir(event): # цикл по атрибутам события
if k[0] != "_": # берутся только неслужебные атрибуты
# готовится описание атрибута события
ev = "%15s: %s\n" % (k, repr(getattr(event, k)))
txt.insert(END, ev) # добавляется в конец текста
txt.bind("<KeyPress>", event_info)
tk.mainloop()Значения некоторых из атрибутов объекта события:
* char - нажатый символ.
* keycode - скан-код символа.
* keysym - символическое имя клавиши.
* serial - номер события, автоматически увеличивается по мере возникновения событий.
* time - время возникновения события, автоматически увеличивается по мере возникновения событий.
* widget - виджет, в котором возникло событие.
* x, y - координаты указателя мыши в виджете во время события.
* x_root, y_root - координаты указателя мыши на экране во время события.
Примечание: можно перенаправить все события внутри подчинённых виджетов на данный виджет с помощью метода grab_set(), а метод grab_release() освобождает виджет от этой обязанности.
Неактивен
Кнопки
Кнопки могут содержать текст или изображения. Кнопка может отобразить текст единственным шрифтом, но текст может располагаться более, чем на одной строке. Кроме того, один из символов может быть подчёркнут, например, чтобы отметить быструю клавишу. Простейшее окно с кнопкой:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
def die(event):
root.destroy()
root = Tk()
button = Button(root)
button["text"] = "Button"
button.bind("<Button>", die)
button.pack()
root.mainloop()Кнопку можно создать и другим способом. В Tkinter предусмотрена процедура создания графического объекта с синтаксисом вызова функции с параметрами (этой строкой можно заменить три соответствующих строки только что приведённого скрипта, при этом параметр event в функции обработки события надо убрать):
button = Button(root, text = u"Кнопка", command = die)
После создания объекта все его свойства можно устанавливать, используя показанный выше синтаксис обращения к словарю: "ключ=значение". Использование выражения "соmаnd=имя_функции" ограничивает ваши возможности назначать только функции без параметров и только единственному событию, тогда как с помощью метода bind() функции обработки можно назначить всем доступным событиям объекта, причём выполнением этих функций можно управлять с помощью параметра. Кстати, bind("<ButtonRelease>", die) будет по умолчанию и обрабатываться несколько иначе, чем соmаnd = die: вы можете проверить это, нажав кнопку мыши в пределах виджета, затем перетащив указатель мыши за пределы виджета, а затем отпустив эту кнопку.
Если вы явно не укажете размер, кнопка будет автоматически отображена достаточно большой, чтобы уместить её надпись. Вы можете использовать свойства padx и pady, чтобы добавить некоторое дополнительное пространство между надписью и границей кнопки. Вы также можете использовать свойства height и width, чтобы явно установить размер. Если вы отображаете в кнопке текст, эти свойства определяют размер кнопки в символах, если же вы отображаете рисунки - в пикселях или экранных единицах.
Вы можете использовать обычные переводы строк или свойство wraplength (максимальная ширина строки в экранных единицах), чтобы заставить кнопку переносить текст по словам. Вы можете использовать свойство relief, чтобы сделать кнопку утопленной, плоской или обведённой рамкой. Вы можете использовать свойства bg и fg для задания цвета кнопки и её текста:
button["fg"] = "green" button["bg"] = "red"
Неактивен
Методы кнопок
flash()
Мигает кнопкой, привлекая к ней внимание. Для получения эффекта задайте свойство activebackground или activeforeground.
invoke()
Вызывает команду, ассоцированную с кнопкой (т.е. эмулирует нажатие кнопки).
Свойства кнопок
activebackground
activeforeground
Цвет фона/текста активной (нажатой) кнопки.
anchor
Выравникание текста (или картинки) кнопки. По сторонам света: N, NE, E, SE, S, SW, W, NW или CENTER (последнее - по умолчанию).
background (bg)
foreground (fg)
Цвет фона/текста кнопки.
bitmap
Картинка на кнопке. Есди задано свойство image, это свойство игнорируется. Возможные значения: error, gray75, gray50, gray25, gray12, hourglass, info, questhead, question и warning.
borderwidth (bd)
Ширина рамки кнопки в пикселах.
command
Функция, вызываемая при нажатии на кнопку.
cursor
Курсор мыши, отображаемый над кнопкой (задается строкой).
disabledforeground
Цвет текста, который будет использоваться, когда кнопка запрещена (disabled).
font
Шрифт текста на кнопке. Например:
import tkFont button["font"] = tkFont.Font(family = "Monospace", size = 40)
image
Рисунок на кнопке. Если задано это свойство, свойства text и bitmap игнорируются. Например:
img = PhotoImage(file = '~/pic.gif') button["image"] = img
justify
Выравнивание текста, если текст содержит несколько строк. LEFT, RIGHT или CENTER.
padx, pady
Внутренние поля кнопки (между краем кнопки и её текстом/рисунком).
relief
Оформление границы. SUNKEN (нажата), RAISED (отпущена), GROOVE, RIDGE или FLAT.
state
Состояние кнопки (обычное, активна, запрещена). NORMAL (по умолчанию), ACTIVE или DISABLED.
takefocus
Возможность участия кнопки в обходе с помощью клавиши Tab. ON или OFF.
text
Текст кнопки. Может содержать переводы строк. Если заданы свойства bitmap или image, это свойство игнорируется.
textvariable
Переменная класса StringVar, ассоциированная с текстом кнопки. Позволяет быстро поменять текст у нескольких виджетов. Пример:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
def f():
v.set(u'Новый текст')
root = Tk()
v = StringVar()
v.set(u'Текст кнопок')
button = Button(root, command = f)
button["textvariable"] = v
button2 = Button(root, command = f)
button2["textvariable"] = v
button.pack()
button2.pack()
root.mainloop()underline
Номер символа текста кнопки, который необходимо подчеркнуть. Значение по умолчанию -1 (никакой символ не подчеркнут).
width, height
Размер кнопки. Если кнопка отображает текст, размер задаётся в символах. Если кнопка отображает изображение, размер задаётся в пикселях (или экранных единицах). Если эти свойства не заданы, размер кнопки рассчитывается автоматически по её содержанию.
wraplength
Максимальная ширина кнопки в экранных единицах. Если текст кнопки не умещается в этой ширине, он будет автоматически разбит на строки.
Неактивен
После рассмотрения виджета "Кнопка" (как примера виджета) можно описать некоторые общие приёмы работы с виджетами.
Каждый виджет имеет свой конструктор, который позволяет задать свойства виджета при его создании единообразным способом:
имя_класса_виджета(родительский_виджет, option=value, ...)
Применение этого конструктора мы уже видели выше на примере кнопок:
button = Button(objRootWindow, text = u"Текст кнопки")
В любой момент можно задать любые свойства каждого виджета следующими равносильными методами:
имя_виджета.configure(option=value, ...) имя_виджета.config(option=value, ...)
Если имя свойства совпадает с ключевым словом Python, к нему в конец добвляется символ подчёркивания (например, "class_").
Кроме того, свойства можно устанавливать и читать по одному, используя синтаксис обращения к словарям:
имя_виджета["имя_свойства"] = value
Метод keys() вернёт список всех свойств виджета:
имя_виджета.keys()
Многие виджеты позволяют задать цвета самого виджета и его текста (свойства типа background и foreground). Вы можете использовать имя цвета или явно определить красный, зеленый и синий (RGB) компоненты.
Имена цветов задаются в виде строк как Red, Green, Blue, Yellow, White, Сyan, Magenta, LightBlue, Moccasin, PeachPuff и т.д. (включая многие экзотические). Имена цветов нечувствительны к регистру и часто позволяют вводить даже пробелы ("Peach puff"). Доступны также системные цвета Windows: SystemActiveBorder, SystemActiveCaption, SystemAppWorkspace, SystemBackground, SystemButtonFace, SystemButtonHighlight, SystemButtonShadow, SystemButtonText, SystemCaptionText, SystemDisabledText, SystemHighlight, SystemHighlightText, SystemInactiveBorder, SystemInactiveCaption, SystemInactiveCaptionText, SystemMenu, SystemMenuText, SystemScrollbar, SystemWindow, SystemWindowFrame, SystemWindowText.
Цвета также задаются строкой в формате #RRGGBB в шестнадцатеричном виде. Способ преобразования из десятичного вида:
tk_rgb = "#%02x%02x%02x" % (128, 192, 200)
Обратное преобразование:
rgb = имя_виджета.winfo_rgb("Peach puff")
red, green, blue = rgb[0]/256, rgb[1]/256, rgb[2]/256Многие виджеты позволяют задавать шрифты (свойства типа font). Tkinter поддерживает несколько способов задания шрифтов:
* Описание шрифта.
* Шрифт, определённый пользователем.
* Системный шрифт.
* X-описание шрифта.
Описание шрифта: вы можете определить шрифт как кортеж, содержащий имя, размер в пунктах и произвольную строку с одним или более стилями шрифта, например:
имя_виджета['font'] = ("Helvetica", 10, "bold italic")Если имя шрифта не содержит пробелов, вы можете задать шрифт одной строкой:
имя_виджета['font'] = "Helvetica 10 bold italic"
Шрифты, как правило всегда доступные в Windows: Arial (Helvetica), Courier New (Courier), Comic Sans MS, Fixedsys, MS Sans Serif, MS Serif, Symbol, System, Times New Roman (Times), Verdana. Доступные стили: normal, bold, roman, italic, underline, overstrike. Если указанный шрифт не обнаружен, будет автоматически подобран похожий.
Шрифт, определённый пользователем: класс Font позволяет создавать объект шрифта.
import tkFont ... ttf = tkFont.Font(family="Helvetica", size=10, weight=tkFont.BOLD, slant=tkFont.ITALIC) имя_виджета['font'] = ttf
Если вы изменяете объект шрифта (используя метод config или обращение к свойству шрифта как к индексу словаря), изменения автоматически применяются ко всем виджетам, использующим этот объект шрифта. Класс Font поддерживает свойства: family, size (в пунктах), weight (NORMAL или BOLD), slant (NORMAL или ITALIC), underline (1 или 0), overstrike (1 или 0).
Системный шрифт: задаётся строкой - ansi, ansifixed, device, oemfixed, system или systemfixed.
X-описание шрифта задаётся строкой и имеет следующий формат (звездочки представляют поля, которые обычно не нужны):
-*-family-weight-slant-*--*-size-*-*-*-*-charset
Имя шрифта (family) может содержать пробелы. Параметр "weight" может принимать значения "Bold" или "Normal". Параметр "slant" может принимать значения "R" (что означает "roman" или "normal"), I (что означает "italic") или "O" (что означает "oblique" - всё тот же курсив). Параметр "size" задаётся в пунктах, умноженных на 10. Параметр "charset" означает кодировку символов. Пример:
-*-Allegretto Script One-Bold-I-*--*-250-*-*-*-*-cp1251
Многие виджеты позволяют задавать курсор мыши, отображаемый над виджетом (свойство cursor, задаётся строкой). Возможные значения: arrow, man, based_arrow_down, middlebutton, based_arrow_up, mouse, boat, pencil, bogosity, pirate, bottom_left_corner, plus, bottom_right_corner, question_arrow, bottom_side, right_ptr, bottom_tee, right_side, box_spiral, right_tee, center_ptr, rightbutton, circle, rtl_logo, clock, sailboat, coffee_mug, sb_down_arrow, cross, sb_h_double_arrow, cross_reverse, sb_left_arrow, crosshair, sb_right_arrow, diamond_cross, sb_up_arrow, dot, sb_v_double_arrow, dotbox, shuttle, double_arrow, sizing, draft_large, spider, draft_small, spraycan, draped_box, star, exchange, target, fleur, tcross, gobbler, top_left_arrow, gumby, top_left_corner, hand1, top_right_corner, hand2, top_side, heart, top_tee, icon, trek, iron_cross, ul_angle, left_ptr, umbrella, left_side, ur_angle, left_tee, watch, leftbutton, xterm, ll_angle, X_cursor, lr_angle.
Неактивен
Флажки
Флажок может содержать текст или изображения, и вы можете связать с флажком функцию Python. Флажок может отобразить текст единственным шрифтом, но текст может содержать больше, чем одну строку. Кроме того, один из символов может быть подчеркнут. Пример отображения флажка:
# -*- coding: utf-8 -*- from Tkinter import * root = Tk() checkbutton = Checkbutton(root) checkbutton["text"] = u"Флажок" checkbutton.pack() root.mainloop()
Чтобы использовать флажок по назначению, необходимо связать его с переменной:
var = IntVar() c = Checkbutton(objRootWindow, text = u"Флажок", variable = var)
По умолчанию такая переменная будет принимать значения 1 и 0, однако это можно изменить, причём переменная даже не обязана быть числом:
# -*- coding: utf-8 -*-
from Tkinter import *
def f():
c['text'] = var.get()
root = Tk()
var = StringVar()
c = Checkbutton(root, text=u"Снят", variable = var, onvalue = u"Установлен",
offvalue=u"Снят", command = f)
c.deselect()
c.pack()
root.mainloop()Методы флажков
deselect()
Снимает флажок.
flash()
Мигает флажком, привлекая к нему внимание. Для получения эффекта задайте свойство activebackground или activeforeground.
invoke()
Имитирует щелчок по флажку.
select()
Устанавливает флажок.
toggle()
Переключает флажок.
Свойства флажков
activebackground
activeforeground
Цвет фона/текста активного (нажатого) флажка.
anchor
Выравникание текста (или картинки) флажка. По сторонам света: N, NE, E, SE, S, SW, W, NW или CENTER (последнее - по умолчанию).
background (bg)
foreground (fg)
Цвет фона/текста флажка.
bitmap
Картинка на флажке. Есди задано свойство image, это свойство игнорируется. Возможные значения: error, gray75, gray50, gray25, gray12, hourglass, info, questhead, question и warning.
borderwidth (bd)
Ширина рамки флажка в пикселах.
command
Функция, вызываемая при щелчке по флажку.
cursor
Курсор мыши, отображаемый над флажком (задается строкой).
disabledforeground
Цвет текста, который будет использоваться, когда флажок запрещён (disabled).
font
Шрифт текста флажка.
image
Рисунок на флажке. Если задано это свойство, свойства text и bitmap игнорируются.
indicatoron
По умолчанию - True. Установка этого свойства в False приведёт к тому, что флажок превратится в кнопку-переключатель.
justify
Выравнивание текста, если текст содержит несколько строк. LEFT, RIGHT или CENTER.
offvalue
onvalue
Значения, соответствующие снятому или установленному флажку. По умолчанию - 0 и 1.
padx, pady
Внутренние поля флажка (между краем флажка и его текстом/рисунком).
relief
Оформление границы. SUNKEN (вдавленный), RAISED (выпуклый), GROOVE, RIDGE или FLAT.
selectcolor
Цвет маленького поля, где расположен собственно сам флажок.
state
Состояние флажка (обычное, активен, запрещён). NORMAL (по умолчанию), ACTIVE или DISABLED.
takefocus
Возможность участия флажка в обходе с помощью клавиши Tab. ON или OFF.
text
Текст флажка. Может содержать переводы строк. Если заданы свойства bitmap или image, это свойство игнорируется.
textvariable
Имеет тот же смысл, что и у кнопок (см. выше).
underline
Номер символа текста флажка, который необходимо подчеркнуть. Значение по умолчанию -1 (никакой символ не подчеркнут).
variable
Переменная, ассоциированная с флажком. Принимает значения onvalue и offvalue (примеры см. выше).
width, height
Размер флажка. Если флажок отображает текст, размер задаётся в символах. Если флажок отображает изображение, размер задаётся в пикселях (или экранных единицах). Если эти свойства не заданы, размер флажка рассчитывается автоматически по его содержанию.
wraplength
Максимальная ширина флажка в экранных единицах. Если текст флажка не умещается в этой ширине, он будет автоматически разбит на строки.
Неактивен
Переключатели
Переключатель может содержать текст или изображения, и вы можете связать с переключателем функцию Python. Переключатель может отобразить текст единственным шрифтом, но текст может содержать больше, чем одну строку. Кроме того, один из символов может быть подчеркнут. Каждая группа переключателей должна быть связана с отдельной переменной, в этом случае каждая кнопка переключателя будет представлять отдельное значение для этой переменной. Пример:
# -*- coding: utf-8 -*-
from Tkinter import *
def f():
b['text'] = v.get()
root = Tk()
v = StringVar()
v.set(u"Вариант №2")
r1 = Radiobutton(root, text=u"Вариант №1",
variable = v, value = u"Вариант №1", command = f)
r2 = Radiobutton(root, text=u"Вариант №2",
variable = v, value = u"Вариант №2", command = f)
b = Button(root, text=v.get(), state = DISABLED)
r1.pack()
r2.pack()
b.pack()
root.mainloop()Методы переключателей
deselect()
Снимает переключатель.
flash()
Мигает переключателем, привлекая к нему внимание. Для получения эффекта задайте свойство activebackground или activeforeground.
invoke()
Имитирует щелчок по переключателю.
select()
Устанавливает переключатель.
Свойства переключателей
activebackground
activeforeground
Цвет фона/текста активного переключателя.
anchor
Выравникание текста (или картинки) переключателя. По сторонам света: N, NE, E, SE, S, SW, W, NW или CENTER (последнее - по умолчанию).
background (bg)
foreground (fg)
Цвет фона/текста переключателя.
bitmap
Картинка на переключателе. Есди задано свойство image, это свойство игнорируется. Возможные значения: error, gray75, gray50, gray25, gray12, hourglass, info, questhead, question и warning.
borderwidth (bd)
Ширина рамки переключателя в пикселах.
command
Функция, вызываемая при щелчке по переключателю.
cursor
Курсор мыши, отображаемый над переключателем (задается строкой).
disabledforeground
Цвет текста, который будет использоваться, когда переключатель запрещён (disabled).
font
Шрифт текста переключателя.
image
Рисунок на переключателе. Если задано это свойство, свойства text и bitmap игнорируются.
indicatoron
По умолчанию - True. Установка этого свойства в False приведёт к тому, что переключатель превратится в кнопку-переключатель.
justify
Выравнивание текста, если текст содержит несколько строк. LEFT, RIGHT или CENTER.
padx, pady
Внутренние поля переключателя (между краем переключателя и его текстом/рисунком).
relief
Оформление границы. SUNKEN (вдавленный), RAISED (выпуклый), GROOVE, RIDGE или FLAT.
selectcolor
Цвет маленького поля, где расположен собственно сам переключатель.
state
Состояние переключателя (обычное, активен, запрещён). NORMAL (по умолчанию), ACTIVE или DISABLED.
takefocus
Возможность участия переключателя в обходе с помощью клавиши Tab. ON или OFF.
text
Текст переключателя. Может содержать переводы строк. Если заданы свойства bitmap или image, это свойство игнорируется.
textvariable
Имеет тот же смысл, что и у кнопок (см. выше).
underline
Номер символа текста переключателя, который необходимо подчеркнуть. Значение по умолчанию -1 (никакой символ не подчеркнут).
value
Значение, ассоциированное с переключателем (примеры см. выше в этом же разделе).
variable
Переменная, ассоциированная с переключателем (примеры см. выше в этом же разделе).
width, height
Размер переключателя. Если переключатель отображает текст, размер задаётся в символах. Если переключатель отображает изображение, размер задаётся в пикселях (или экранных единицах). Если эти свойства не заданы, размер переключателя рассчитывается автоматически по его содержанию.
wraplength
Максимальная ширина переключателя в экранных единицах. Если текст переключателя не умещается в этой ширине, он будет автоматически разбит на строки.
Неактивен
Метки (надписи)
Метка может содержать текст или изображения. Метка может отобразить текст единственным шрифтом, но текст может содержать больше, чем одну строку. Кроме того, один из символов может быть подчеркнут. Свойства меток:
anchor
Выравникание текста (или картинки) метки. По сторонам света: N, NE, E, SE, S, SW, W, NW или CENTER (последнее - по умолчанию).
background (bg)
foreground (fg)
Цвет фона/текста метки.
bitmap
Картинка на метке. Есди задано свойство image, это свойство игнорируется. Возможные значения: error, gray75, gray50, gray25, gray12, hourglass, info, questhead, question и warning.
borderwidth (bd)
Ширина рамки метки в пикселах.
cursor
Курсор мыши, отображаемый над меткой (задается строкой).
font
Шрифт текста метки.
image
Рисунок на метке. Если задано это свойство, свойства text и bitmap игнорируются.
justify
Выравнивание текста, если текст содержит несколько строк. LEFT, RIGHT или CENTER.
padx, pady
Внутренние поля метки (между краем метки и его текстом/рисунком).
relief
Оформление границы. SUNKEN (вдавленный), RAISED (выпуклый), GROOVE, RIDGE или FLAT.
state
Состояние метки (обычное, активен, запрещён). NORMAL (по умолчанию), ACTIVE или DISABLED.
text
Текст метки. Может содержать переводы строк. Если заданы свойства bitmap или image, это свойство игнорируется.
textvariable
Имеет тот же смысл, что и у кнопок (см. выше).
underline
Номер символа текста метки, который необходимо подчеркнуть. Значение по умолчанию -1 (никакой символ не подчеркнут).
width, height
Размер метки. Если метка отображает текст, размер задаётся в символах. Если метка отображает изображение, размер задаётся в пикселях (или экранных единицах). Если эти свойства не заданы, размер метки рассчитывается автоматически по её содержанию.
wraplength
Максимальная ширина метки в экранных единицах. Если текст метки не умещается в этой ширине, он будет автоматически разбит на строки.
Несмотря на то, что у меток нет свойства "command", вы можете связывать с ними события с помощью метода "bind" (см. выше о событиях).
Неактивен
Поля ввода
Поле ввода (Entry) позволяет пользователю вводить одну строку текста, в единственном шрифте. Стандартные поля ввода по умолчанию не поддерживают контекстного меню для операций с буфером и клавиши Ctrl+c, Ctrl+v, Ctrl+x. На некоторых системах поддерживаются сочетания клавиш Ctrl+Ins, Shift+Ins, Shift+Del или копирование выделенного текста в указанное место средней клавишей мыши; такое копирование можно производить между виджетами (выделенный текст запоминается в своеобразном буфере).
Методы полей ввода приведены ниже. В методах в качестве индексов символов можно использовать константы ANCHOR (позиция начала текста или начала выделения, если оно есть), INSERT (позиция курсора) и END (конец текста). Примечание: если выделение производилось справа налево, ANCHOR будет указывать на визуальный конец выделения; если только что вставлялся текст, ANCHOR становится ненадёжным и может указывать на неожиданные позиции.
В методах вместо индексов символов можно использовать также строки вида '@n' или '"@%d" % n', где n - количество пикселей от левого края виджета. При этом не имеет значения, насколько "прокручен" текст в поле ввода - работа производится с видимой частью текста.
Методы полей ввода
delete (first, last=None)
Удаляет символы из виджета, начиная с символа с индексом first, до символа с индексом last (не включая последний символ). Если второй параметр опущен, удаляется один символ.
get()
Возвращает текст, введённый в поле ввода.
icursor (index)
Устанавливает курсор в указанную позицию, при этом изменяется индекс INSERT. Текст поля ввода при этом визуально не прокручивается.
index (index)
Возвращает число, соответствующее указанному индексу (например, ANCHOR, INSERT или END).
insert (index, s)
Вставляет строку s перед символом с указанным индексом.
select_adjust (index)
selection_adjust (index)
Этот метод используется, чтобы удостовериться, что выделение включает символ c указанным индексом. Если выделение уже включает этот символ, ничего не происходит. В противном случае выделение расширяется от его текущей позиции (или от позиции курсора, если выделения нет) так, чтобы включить указанный индекс.
select_clear()
selection_clear()
Сбрасывает выделение.
select_from (index)
selection_from (index)
Устанавливает индекс ANCHOR.
select_present()
selection_present()
Если есть выделение, возвращает True, иначе возвращает False.
select_range (start, end)
selection_range (start, end)
Явно устанавливает выделение. Параметр start должен быть меньшим, чем end. Используйте selection_range (0, END), чтобы выделить весь текст.
select_to (index)
selection_to (index)
Выделяет текст между ANCHOR и указанным индексом.
xview (index)
Прокручивает текст в случае необходимости так, чтобы указанный символ стал видимым.
xview_moveto (f)
Прокручивает текст в начало (0) или в конец (1), для частичной прокрутки возможны дробные значения в диапазоне от 0 до 1.
xview_scroll (number, what)
Прокручивает текст на указанное количество символов или "страниц". Параметр number может быть отрицательным (прокрутка назад), а параметр what может принимать значения UNITS и PAGES.
Свойства полей ввода
background (bg)
foreground (fg)
Цвет фона/текста поля ввода.
borderwidth (bd)
Ширина рамки поля ввода в пикселах.
cursor
Курсор мыши, отображаемый над полем ввода (задается строкой).
exportselection
Если True, выделенный текст автоматически помещается в специальный буфер, что позволяет копировать этот текст в указанное место средней клавишей мыши. По умолчанию - True.
font
Шрифт текста поля ввода.
insertbackground
Цвет курсора вставки.
insertborderwidth
Толщина рамки выпуклого курсора вставки. Для достижения эффекта значение свойства insertwidth должно быть достаточно большим.
insertofftime
Время в миллисекундах, которое мигающий курсор вставки отсутствует на экране.
insertontime
Время в миллисекундах, которое мигающий курсор вставки присутствует на экране.
insertwidth
Толщина курсора вставки.
justify
Выравнивание текста. LEFT, RIGHT или CENTER.
relief
Оформление границы. SUNKEN (вдавленный), RAISED (выпуклый), GROOVE, RIDGE или FLAT.
selectbackground
Цвет заливки выделения.
selectborderwidth
Толщина специальной рамки выделения.
selectforeground
Цвет выделенного текста.
show
Символ для отображения ввода пароля (например, "*"). При нажатии Ctrl+Ins в буфер будет копироваться строка из этих символов, т.е. пароль будет защищён от копирования в буфер.
state
Состояние поля ввода (обычное, активно, запрещено). NORMAL (по умолчанию), ACTIVE или DISABLED.
takefocus
Возможность участия поля ввода в обходе с помощью клавиши Tab. ON или OFF.
textvariable
Имеет тот же смысл, что и у кнопок (см. выше соответствующий раздел).
width
Размер поля ввода в символах (по умолчанию - 20).
xscrollcommand
Это свойство устанавливается к методу "set" связанного элемента управления, предназначенного для прокрутки текста (см. пример ниже), что обеспечивает автоматические появление ползунка, когда текста становится достаточно много.
Пример поля ввода с горизонтальной прокруткой текста:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
# обработчик события прокрутки
def f(event, *L): # принимает два или три аргумента
if event == 'scroll': # только в этом случае есть третий аргумент
direction = L[0] # направление (1 или -1)
discontinuity = L[1] # дискретность (units или pages)
ent.xview_scroll(direction, discontinuity)
elif event == 'moveto':
direction = L[0] # степень частичной прокрутки (от 0 до 1)
ent.xview_moveto(direction)
root = Tk()
scr = Scrollbar(root, orient = HORIZONTAL, command = f)
ent = Entry(root, font = 'Arial 20', xscrollcommand = scr.set)
ent.pack(fill=X)
scr.pack(fill=X)
root.mainloop()Неактивен
У GUI Tkinter всегда есть корневое окно, которое создаётся по умолчанию или явно, с помощью конструктора Tk(). Помимо этого можно создать любое число независимых окон с помощью конструктора Toplevel(). Обычно окна Toplevel используются для реализации модальных и немодальных диалоговых окон. Окна Toplevel не являются независимыми процессами и будут автоматически уничтожены при завершении программы. Графические элементы Tk и Toplevel похожи и обычно в документации рассматриваются вместе. Если в сценарии окно Toplevel создано до явного создания корневого окна Tk, последнее будет создано автоматически; если корневое окно Tk создано в сценарии после окна Toplevel, это будет уже второе корневое окно. Таким образом, чтобы избежать путаницы, лучше всего создавать корневые окна Tk в самом начале сценария и явным образом.
Свойства окон
background (bg)
Цвет фона.
borderwidth (bd)
Ширина рамки.
cursor
Курсор мыши, отображаемый над окном (задается строкой).
width, height
Размер окна.
relief
Оформление границы окна. SUNKEN, RAISED, GROOVE, RIDGE или FLAT.
Методы окон
aspect(nmin, dmin, nmax, dmax)
Отношение ширина/высота окна будет всегда лежать в диапазоне от nmin/dmin до nmax/dmax. Например, вызов "aspect(1, 1, 1, 1)" приведёт к тому, что окно всегда будет квадратным, а вызов "aspect(1, 1, 2, 1)" - к тому, что геометрия окна будет изменяться только в диапазоне от 1/1 до 2/1. Отношение nmin/dmin должно быть меньше или равно отношению nmax/dmax. Если метод не вызывался, параметры нулевые или заданы неверно, ограничений нет. Под Windows метод не работает.
iconify()
deiconify()
Сворачивает/разворачивает окно.
geometry(newGeometry=None)
Определяет размеры и положение окна на экране. Параметр задаётся строкой в формате "WxH±X±Y", где:
- "W" и "H" - ширина и высота в пикселях, разделённые символом "x".
- "X" - расстояние левого края окна от левого края Рабочего стола (если задано со знаком плюс) или расстояние правого края окна от правого края Рабочего стола (если задано со знаком минус).
- "Y" - расстояние верхнего края окна от верхнего края Рабочего стола (если задано со знаком плюс) или расстояние нижнего края окна от нижнего края Рабочего стола (если задано со знаком минус).
lift(aboveThis=None)
lower(belowThis=None)
Чтобы вывести это окно на передний план в менеджере окон, вызовите метод lift без параметров. Можно также поднять окно просто выше другого окна Toplevel, передавая другое окно как параметр. Метод lower работает аналогично, но "наоборот", помещая окно на задний план.
maxsize(width=None, height=None)
minsize(width=None, height=None)
Задают возможные максимальные и минимальные размеры окна. Под Windows максимальные размеры учитываются и при разворачивании окна "на весь экран".
resizable(width=None,height=None)
Разрешает интерактивное изменение ширины и/или высоты окна. Аргументы принимают булев тип (true - разрешено).
title(text=None)
Задаёт заголовок окна.
withdraw()
Скрывает окно. Для восстановления можно использовать методы deiconify() или iconify().
Пример вызова некоторых свойств и методов:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
MainWindow = Tk()
MainWindow['bg'] = '#BDC6D3'
MainWindow['bd'] = 5
MainWindow['relief'] = RAISED
MainWindow['cursor'] = 'hand2'
MainWindow['width'] = 400
MainWindow['height'] = 300
MainWindow.aspect(4, 3, 4, 3)
MainWindow.geometry('400x300-100+500')
MainWindow.maxsize(600, 450)
MainWindow.minsize(200, 150)
MainWindow.title(u'Пример заголовка окна')
MainWindow.mainloop()Неактивен
Несколько небольших примеров работы с окнами Tk и Toplevel.
Задание монохромной иконки окна в формате .xbm, под Linux:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
win = Tk()
win.iconbitmap('@/some/path/kde2.xbm')
win.mainloop()Примечание: под Windows поддерживаются цветные иконки в формате .ico, знак "@" в начале строки пути не нужен.
Пример запрета закрытия окна:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
root = Tk()
Button(root, text = u'Завершение работы', command = root.destroy).pack()
root.protocol('WM_DELETE_WINDOW', lambda: 0) # перехват закрытия окна
root.mainloop()Использование стандартных (common) диалогов:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
from tkMessageBox import *
def b():
if askyesno(u'Вопрос', u'Нажмите "Да" или "Нет".'):
showwarning(u'Сообщение', u'Вы нажали "Да."')
else:
showwarning(u'Сообщение', u'Вы нажали "Нет."')
root = Tk()
Button(root, text = u'Нажми меня', command = b).pack()
root.mainloop()Примечание: замечено, что под Linux такие диалоги могут оказаться "не совсем модальными" (что от них ожидается). Когда такой диалог находится на экране, можно передать фокус в главное окно и закрыть его "крестиком", в результате чего приложение может завершиться с ошибками, которые будут выведены на консоль (GNOME), или даже зависнуть (KDE).
Неактивен
Следующий простой пример позволяет быстро просмотреть все курсоры, которые доступны в Tkinter, в интерактивном режиме, нажатиями на кнопку:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
class GUI():
def __init__(self):
self.counter = 0
self.MainWindow = Tk()
self.CursorButton = Button(self.MainWindow, text=u"Сменить курсор", command=self.change_cursor, width=22)
self.CursorButton.pack()
self.MainWindow.mainloop()
def change_cursor(self):
Cursors = str("arrow, man, based_arrow_down, middlebutton, based_arrow_up, mouse, boat, pencil, bogosity, pirate, bottom_left_corner, plus, bottom_right_corner, question_arrow, bottom_side, right_ptr, bottom_tee, right_side, box_spiral, right_tee, center_ptr, rightbutton, circle, rtl_logo, clock, sailboat, coffee_mug, sb_down_arrow, cross, sb_h_double_arrow, cross_reverse, sb_left_arrow, crosshair, sb_right_arrow, diamond_cross, sb_up_arrow, dot, sb_v_double_arrow, dotbox, shuttle, double_arrow, sizing, draft_large, spider, draft_small, spraycan, draped_box, star, exchange, target, fleur, tcross, gobbler, top_left_arrow, gumby, top_left_corner, hand1, top_right_corner, hand2, top_side, heart, top_tee, icon, trek, iron_cross, ul_angle, left_ptr, umbrella, left_side, ur_angle, left_tee, watch, leftbutton, xterm, ll_angle, X_cursor, lr_angle").split(",")
try:
self.CursorButton["text"] = Cursors[self.counter]
self.CursorButton["cursor"] = Cursors[self.counter]
self.counter = self.counter+1
except IndexError:
self.CursorButton["cursor"] = ""
self.CursorButton["text"] = u"Просмотр завершён"
GUI()Автор примера — diam123.
Неактивен
Усовершенствование предыдущего примера: все курсоры, которые доступны в Tkinter, можно просмотреть не только в интерактивном режиме, нажатиями на кнопку, но и выбором из списка.
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
class GUI():
def __init__(self):
self.Cursors = str(" arrow, man, based_arrow_down, middlebutton, based_arrow_up, mouse, boat, pencil, bogosity, pirate, bottom_left_corner, plus, bottom_right_corner, question_arrow, bottom_side, right_ptr, bottom_tee, right_side, box_spiral, right_tee, center_ptr, rightbutton, circle, rtl_logo, clock, sailboat, coffee_mug, sb_down_arrow, cross, sb_h_double_arrow, cross_reverse, sb_left_arrow, crosshair, sb_right_arrow, diamond_cross, sb_up_arrow, dot, sb_v_double_arrow, dotbox, shuttle, double_arrow, sizing, draft_large, spider, draft_small, spraycan, draped_box, star, exchange, target, fleur, tcross, gobbler, top_left_arrow, gumby, top_left_corner, hand1, top_right_corner, hand2, top_side, heart, top_tee, icon, trek, iron_cross, ul_angle, left_ptr, umbrella, left_side, ur_angle, left_tee, watch, leftbutton, xterm, ll_angle, X_cursor, lr_angle").split(",")
self.MainWindow = Tk()
self.MainWindow.resizable(width=None, height=None)
self.MainFrame = Frame(self.MainWindow, bd=5)
self.MainLabel = Label(self.MainWindow, text=u"Демонстрация курсоров,\nдоступных в стандартной\nпоставке библиотеки\nTkinter", bd=5)
self.MainLabel.pack()
self.FromList = Button(self.MainFrame, text = u"Из списка", command=self.using_list)
self.UsingButton = Button(self.MainFrame, text = u"Нажатием", command=self.using_button)
self.MainFrame.pack()
self.FromList.pack()
self.UsingButton.pack()
self.MainWindow.mainloop()
def using_button(self):
self.MainFrame.destroy()
self.counter = 0
self.CursorButton = Button(self.MainWindow, text=u"Сменить курсор", command=self.change_cursor_using_button, width=30)
self.CursorButton.pack()
def change_cursor_using_button(self):
try:
self.CursorButton["text"] = self.Cursors[self.counter]
self.MainWindow["cursor"] = self.Cursors[self.counter]
self.counter = self.counter+1
except IndexError:
self.MainWindow["cursor"] = ""
self.CursorButton["text"] = u"Вы просмотрели все курсоры"
def using_list(self):
self.MainFrame.destroy()
self.ListScrollbar = Scrollbar(self.MainWindow)
self.ListBox = Listbox(self.MainWindow, bd=5, yscrollcommand=self.ListScrollbar.set)
self.ShowButton = Button(self.MainWindow, text=u"Показать курсор", width=self.ListBox["width"], command=self.change_cursor_using_list)
for number in xrange(len(self.Cursors)):
self.ListBox.insert(number, self.Cursors[number])
self.ListScrollbar.pack(side = "right", fill="y")
self.ListScrollbar.config(command = self.ListBox.yview)
self.ListBox.pack()
self.ShowButton.pack(side="bottom")
def change_cursor_using_list(self):
Selected = self.ListBox.curselection()
try:
self.MainWindow["cursor"] = self.Cursors[int(Selected[0])]
except IndexError:
pass
GUI()Автор примера — diam123.
Неактивен