Spec-Zone.ru › Python 2.7

Tkinter — Python-интерфейс к Tcl/Tk

Модуль Tkinter («Tk-интерфейс») является стандартным Python-интерфейсом к набору инструментов Tk GUI. Tk и Tkinter доступны на большинстве платформ Unix, а также на системах Windows. (Сам Tk не входит в Python; он поддерживается компанией ActiveState.)

Запуск python -m Tkinter из командной строки должен открыть окно, демонстрирующее простой Tk-интерфейс, показывая, что Tkinter правильно установлен на вашей системе, а также показывая версию установленного Tcl/Tk, так что вы можете прочитать документацию Tcl/Tk, специфичную для этой версии.

Примечание

Tkinter был переименован в tkinter в Python 3. Инструмент 2to3 автоматически адаптирует импорты при преобразовании ваших исходных файлов в Python 3.

См. также

Документация Tkinter:

Python Tkinter Resources

Руководство по теме Python Tkinter предоставляет много информации о работе с Tk из Python и ссылки на другие источники информации о Tk.

TKDocs

Подробный учебник плюс более дружественные страницы виджетов для некоторых из них.

Tkinter 8.5 справочник: графический интерфейс пользователя для Python

Справочная информация в интернете.

Tkinter docs от effbot

Онлайн справочник по tkinter, поддерживаемый effbot.org.

Programming Python

Книга Марка Лутца, с отличным охватом Tkinter.

Modern Tkinter for Busy Python Developers

Книга Марка Роземана о создании привлекательных и современных графических пользовательских интерфейсов с помощью Python и Tkinter.

Python and Tkinter Programming

Книга Джона Грейсона (ISBN 1-884777-81-3).

Документация Tcl/Tk:

Команды Tk

Большинство команд доступны в виде классов Tkinter или Tkinter.ttk. Измените ‘8.6’ на соответствие версии вашего Tcl/Tk.

Последние страницы руководства Tcl/Tk

Последние руководства Tcl/Tk на www.tcl.tk.

Главная страница ActiveState Tcl

Разработка Tk/Tcl в значительной степени происходит в ActiveState.

Tcl and the Tk Toolkit

Книга Джона Аустерхаута, изобретателя Tcl.

Practical Programming in Tcl and Tk

Энциклопедическая книга Брента Уэлча.

1. Модули Tkinter

В большинстве случаев модуль Tkinter — всё, что вам действительно нужно, но также доступно несколько дополнительных модулей. Tk-интерфейс находится в двоичном модуле под названием _tkinter. Этот модуль содержит низкоуровневый интерфейс к Tk и никогда не должен использоваться непосредственно программистами приложений. Обычно это общая библиотека (или DLL), но в некоторых случаях может быть статически связана с интерпретатором Python.

Помимо модуля Tk-интерфейса, Tkinter включает несколько Python-модулей. Два наиболее важных модуля — это сам модуль Tkinter и модуль под названием Tkconstants. Первый автоматически импортирует второй, поэтому для использования Tkinter вам нужно только импортировать один модуль:

import Tkinter

Или, чаще:

from Tkinter import *
class Tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=1)

Класс Tk создается без аргументов. Это создает виджет верхнего уровня Tk, который обычно является основным окном приложения. Каждый экземпляр имеет свой связанный интерпретатор Tcl.

Изменено в версии 2.4: Добавлен параметр useTk.

Tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=0)

Функция Tcl() — это функция-фабрика, которая создаёт объект, очень похожий на тот, что создаётся классом Tk, за исключением того, что она не инициализирует подсистему Tk. Это чаще всего полезно при управлении интерпретатором Tcl в среде, где не нужно создавать лишних окон верхнего уровня, или где это невозможно (например, на системах Unix/Linux без сервера X). Объект, созданный объектом Tcl(), может иметь созданное окно Toplevel (и инициализированную подсистему Tk) путём вызова его метода loadtk().

Добавлен в версии 2.4.

Другие модули, которые предоставляют поддержку Tk:

ScrolledText

Текстовый виджет со встроенной вертикальной полосой прокрутки.

tkColorChooser

Диалоговое окно для выбора цвета пользователем.

tkCommonDialog

Базовый класс для диалоговых окон, определённых в других модулях, перечисленных здесь.

tkFileDialog

Общие диалоговые окна, позволяющие пользователю указать файл для открытия или сохранения.

tkFont

Утилиты для работы с шрифтами.

tkMessageBox

Доступ к стандартным диалоговым окнам Tk.

tkSimpleDialog

Основные диалоговые окна и вспомогательные функции.

Tkdnd

Поддержка перетаскивания для Tkinter. Это экспериментально и должно стать устаревшим, когда будет заменено на Tk DND.

turtle

Графика черепахи в окне Tk.

Они также были переименованы в Python 3; все они были сделаны подмодулями нового пакета tkinter.

2. Tkinter Справочник

Этот раздел не предназначен для исчерпывающего руководства по Tk или Tkinter. Скорее, он предназначен как временное решение, предоставляя некоторое введение в систему.

Благодарности:

  • Tkinter был написан Стейном Люмхольтом и Гидо ван Россумом.
  • Tk был написан Джоном Аустерхаутом в Беркли.
  • Этот справочник был написан Мэттом Конвеем в Университете Вирджинии.
  • Отображение html, и некоторые свободные изменения были получены из версии FrameMaker Кенном Манхаймером.
  • Фредрик Лундх обработал и переработал описания интерфейса классов, чтобы привести их в соответствие с Tk 4.2.
  • Майк Кларксон преобразовал документацию в LaTeX и скомпилировал главу «Пользовательский интерфейс» справочного руководства.

2.1. Как использовать этот раздел

Этот раздел разработан в двух частях: первая (приблизительно) охватывает базовые материалы, а вторая может быть использована как удобная справка.

При попытке ответить на вопросы вида «как сделать такое-то действие», часто лучше сначала выяснить, как сделать «такое-то действие» в чистом Tk, а затем перевести это обратно в соответствующий вызов Tkinter. Программисты Python часто могут догадаться о правильной команде Python, посмотрев документацию Tk. Это означает, что для использования Tkinter вам нужно будет немного знать о Tk. Этот документ не может выполнить эту роль, поэтому лучше всего направить вас к лучшей существующей документации. Вот несколько подсказок:

  • Авторы настоятельно рекомендуют получить копию страниц руководства Tk. В частности, страницы руководства в каталоге mann наиболее полезны. Страницы руководства man3 описывают C-интерфейс библиотеки Tk и поэтому не особенно полезны для сценаристов.
  • Издательство Addison-Wesley выпускает книгу Tcl and the Tk Toolkit, написанную Джоном Аустерхаутом (ISBN 0-201-63337-X), которая является хорошим введением в Tcl и Tk для новичков. Книга не исчерпывает все детали и в многих случаях ссылается на страницы руководства.
  • Tkinter.py — последнее средство для большинства, но может быть хорошим местом для обращения, когда ничего другого не помогает.

2.2. Программа «Привет, мир»

from Tkinter import *

class Application(Frame):
    def say_hi(self):
        print "hi there, everyone!"

    def createWidgets(self):
        self.QUIT = Button(self)
        self.QUIT["text"] = "QUIT"
        self.QUIT["fg"]   = "red"
        self.QUIT["command"] =  self.quit

        self.QUIT.pack({"side": "left"})

        self.hi_there = Button(self)
        self.hi_there["text"] = "Hello",
        self.hi_there["command"] = self.say_hi

        self.hi_there.pack({"side": "left"})

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()

3. Краткий обзор Tcl/Tk

Иерархия классов выглядит сложной, но на практике программисты приложений почти всегда ссылаются на классы в самом низу иерархии.

Примечания:

  • Эти классы предоставлены для организации определенных функций под одним именем пространства имён. Они не предназначены для независимого экземплярирования.
  • Класс Tk предназначен для экземплярирования только один раз в приложении. Разработчики приложений не должны явно экземпляризировать его; система создаёт его всякий раз, когда экземпляризируются другие классы.
  • Класс Widget не предназначен для экземплярирования, он предназначен только для наследования, чтобы создавать «реальные» виджеты (в C++ это называется «абстрактным классом»).

Для использования данного справочного материала в некоторых случаях вам потребуется знать, как читать короткие фрагменты кода Tk и как идентифицировать различные части команды Tk. (См. раздел Сопоставление основных команд Tk с Tkinter для эквивалентов Tkinter того, что приведено ниже.)

Сценарии Tk представляют собой программы Tcl. Как и все программы Tcl, сценарии Tk представляют собой просто списки токенов, разделенных пробелами. Виджет Tk — это просто его тип, настройки, которые помогают его настроить, и действия, которые позволяют ему выполнять полезные задачи.

Чтобы создать виджет в Tk, команда всегда имеет следующий формат:

classCommand newPathname options
командаТипа

указывает, какой вид виджета нужно создать (кнопка, метка, меню…)

новоеИмяПути

является новым именем для этого виджета. Все имена в Tk должны быть уникальными. Для обеспечения этого виджеты в Tk имеют имена с путями, как и файлы в файловой системе. Виджет верхнего уровня, корень, называется . (точка), а дочерние элементы разделяются точками. Например, .myApp.controlPanel.okButton может быть именем виджета.

настройки

настраивают внешний вид виджета, а в некоторых случаях и его поведение. Параметры представлены в виде списка флагов и значений. Флаги предваряются знаком «-», как флаги команд оболочки Unix, а значения заключаются в кавычки, если они состоят более чем из одного слова.

Например:

button   .fred   -fg red -text "hi there"
   ^       ^     \_____________________/
   |       |                |
 class    new            options
command  widget  (-opt val -opt val ...)

После создания путь к виджету становится новой командой. Эта новая команда виджета — это средство разработчика для того, чтобы заставить новый виджет выполнить какое-либо действие. В C это выражается как someAction(fred, someOptions), в C++ как fred.someAction(someOptions), а в Tk как:

.fred someAction someOptions

Обратите внимание, что имя объекта, .fred, начинается с точки.

Как можно ожидать, допустимые значения для someAction будут зависеть от типа виджета: .fred disable работает, если fred — кнопка (fred становится серым), но не работает, если fred — метка (отключение меток не поддерживается в Tk).

Допустимые значения someOptions зависят от действия. Некоторые действия, например disable, не требуют аргументов, другие, например, команда delete текстового поля ввода, требуют аргументов для указания диапазона текста для удаления.

4. Сопоставление основных команд Tk с Tkinter

Команды типов в Tk соответствуют конструкторам классов в Tkinter.

button .fred                =====>  fred = Button()

Владелец объекта подразумевается в новом имени, присвоенном ему во время создания. В Tkinter владельцы указываются явно.

button .panel.fred          =====>  fred = Button(panel)

Параметры настройки в Tk задаются списками помеченных тире тегов, за которыми следуют значения. В Tkinter параметры задаются в качестве ключевых аргументов в конструкторе экземпляра и ключевых аргументов для вызовов configure или в виде индексов экземпляров в стиле словаря для уже созданных экземпляров. См. раздел Установка параметров по установке параметров.

button .fred -fg red        =====>  fred = Button(panel, fg = "red")
.fred configure -fg red     =====>  fred["fg"] = red
                            OR ==>  fred.config(fg = "red")

В Tk для выполнения действия над виджетом используйте имя виджета как команду и следуйте за ним именем действия, возможно, с аргументами (параметрами). В Tkinter вызывайте методы экземпляра класса для вызова действий над виджетом. Действия (методы), которые может выполнять заданный виджет, перечислены в модуле Tkinter.py.

.fred invoke                =====>  fred.invoke()

Для передачи виджета в менеджер компоновки (Pack) вызывается pack с необязательными аргументами. В Tkinter класс Pack содержит всю эту функциональность, и различные формы команды pack реализованы как методы. Все виджеты в Tkinter наследуются от Packer и поэтому наследуют все методы компоновки. Дополнительную информацию о менеджере компоновки Form см. в документации модуля Tix.

pack .fred -side left       =====>  fred.pack(side = "left")

5. Связь между Tk и Tkinter

Сверху вниз:

Ваше приложение здесь (Python)

Приложение Python вызывает Tkinter.

Tkinter (модуль Python)

Этот вызов (например, создание виджета кнопки) реализован в модуле Tkinter, написанном на Python. Эта функция Python будет анализировать команды и аргументы и преобразовывать их в форму, которая позволит им выглядеть так, как будто они пришли из сценария Tk, а не из сценария Python.

tkinter (C)

Эти команды и их аргументы будут переданы функции C в модуле расширения tkinter — обратите внимание на строчные буквы —.

Виджеты Tk (C и Tcl)

Эта функция C может вызывать другие модули C, включая функции C, которые составляют библиотеку Tk. Tk реализовано на C и частично на Tcl. Часть Tcl виджетов Tk используется для связывания определенного поведения по умолчанию с виджетами и выполняется один раз в тот момент, когда импортируется модуль Python Tkinter. (Пользователь этого этапа никогда не видит).

Tk (C)

Часть Tk виджетов Tk реализует окончательное сопоставление с …

Xlib (C)

библиотекой Xlib для отрисовки графики на экране.

6. Справочник

6.1. Установка параметров

Параметры управляют такими вещами, как цвет и толщина рамки виджета. Параметры можно установить тремя способами:

При создании объекта, используя ключевые аргументы
fred = Button(self, fg = "red", bg = "blue")
После создания объекта, рассматривая имя параметра как индекс словаря
fred["fg"] = "red"
fred["bg"] = "blue"
Используйте метод config() для обновления нескольких атрибутов после создания объекта
fred.config(fg = "red", bg = "blue")

Для получения полного объяснения заданного параметра и его поведения см. страницы справки Tk для соответствующего виджета.

Обратите внимание, что страницы справки перечисляют «СТАНДАРТНЫЕ ПАРАМЕТРЫ» и «СПЕЦИФИЧЕСКИЕ ДЛЯ ВИДЖЕТОВ ПАРАМЕТРЫ» для каждого виджета. Первый — это список параметров, общих для многих виджетов, второй — параметры, специфичные для конкретного виджета. Стандартные параметры документированы на странице справки options(3).

В данном документе различия между стандартными и специфичными для виджетов параметрами не делаются. Некоторые параметры не применяются к некоторым видам виджетов. То, реагирует ли конкретный виджет на определённый параметр, зависит от типа виджета; кнопки имеют параметр command , метки — нет.

Поддерживаемые параметр виджета перечислены на странице справки этого виджета или могут быть запрошены во время выполнения, вызвав метод config() без аргументов или вызвав метод keys() для этого виджета. Возвращаемое значение этих вызовов — это словарь, ключ которого — имя параметра в виде строки (например, 'relief'), а значения — 5-кортежи.

Некоторые параметры, например bg , являются синонимами для общих параметров с длинными именами (bg является сокращением для «background»). Передача методу config() имени сокращенного параметра вернет 2-кортеж, а не 5-кортеж. 2-кортеж, возвращаемый назад, будет содержать имя синонима и «реальный» параметр (например, ('bg', 'background')).

Индекс

Значение

Пример

0

имя параметра

'relief'

1

имя параметра для поиска в базе данных

'relief'

2

класс параметра для поиска в базе данных

'Relief'

3

значение по умолчанию

'raised'

4

текущее значение

'groove'

Пример:

>>> print fred.config()
{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}

Конечно, напечатанный словарь будет включать все доступные параметры и их значения. Это лишь пример.

6.2. Менеджер компоновки Packer

Packer — один из механизмов управления геометрией Tk. Менеджеры геометрии используются для указания относительного расположения виджетов внутри их контейнера — их общего владельца. В отличие от более громоздкого менеджера placer (который используется реже, и мы его здесь не рассматриваем), менеджер packer принимает указания о качественных отношениях — над, слева от, заполняя и т. д. — и рассчитывает точные координаты размещения виджетов за вас.

Размер любого виджета владельца определяется размером «дочерних виджетов» внутри. Менеджер packer используется для управления тем, где появляются дочерние виджеты внутри владельца, в который они упакованы. Вы можете упаковывать виджеты в фреймы, а фреймы — в другие фреймы, чтобы добиться желаемой компоновки. Кроме того, расположение динамически корректируется для учёта пошаговых изменений в конфигурации после упаковки.

Обратите внимание, что виджеты не отображаются до тех пор, пока не будут заданы их геометрические параметры с помощью менеджера геометрии. Это распространённая ошибка в начале работы — пропустить указание геометрических параметров, а затем удивляться, что виджет создан, но ничего не отображается. Виджет отобразится только после того, как к нему, например, будет применено свойство менеджера packer — метод pack().

Метод pack() можно вызывать с парами ключевых параметров/значений, которые управляют тем, где будет отображаться виджет внутри контейнера и как он будет вести себя при изменении размера основного окна приложения. Вот несколько примеров:

fred.pack()                     # defaults to side = "top"
fred.pack(side = "left")
fred.pack(expand = 1)

6.3. Параметры менеджера компоновки Packer

Для получения более подробной информации о менеджере компоновки packer и параметрах, которые он может принимать, см. страницы справки и страницу 183 книги Джона Аустерхаута.

anchor

Тип якоря. Обозначает, куда пакер должен поместить каждый подчиненный элемент в свой пакет.

expand

Булево значение, 0 или 1.

fill

Допустимые значения: 'x', 'y', 'both', 'none'.

ipadx и ipady

Расстояние — определяющее внутренний отступ с каждой стороны виджета-подчиненного элемента.

padx и pady

Расстояние — определяющее внешний отступ с каждой стороны виджета-подчиненного элемента.

side

Допустимые значения: 'left', 'right', 'top', 'bottom'.

6.4. Переменные виджетов-связей

Текущее значение некоторых виджетов (например, виджетов ввода текста) можно напрямую связать с переменными приложения, используя специальные опции. Эти опции — variable, textvariable, onvalue, offvalue, и value. Эта связь работает в обе стороны: если переменная изменится по любой причине, виджет, к которому она привязана, будет обновлён, отражая новое значение.

К сожалению, в текущей реализации Tkinter невозможно передать произвольную Python-переменную виджету через опцию variable или textvariable. Работают только переменные, являющиеся подклассами класса Variable, определённого в модуле Tkinter.

Уже определено множество полезных подклассов Variable: StringVar, IntVar, DoubleVar, и BooleanVar. Чтобы прочитать текущее значение такой переменной, вызовите метод get() на ней, а чтобы изменить её значение, вызовите метод set().

Если вы следуете этому протоколу, виджет будет всегда отслеживать значение переменной без вашего дальнейшего вмешательства.

Например:

class App(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()

        self.entrythingy = Entry()
        self.entrythingy.pack()

        # here is the application variable
        self.contents = StringVar()
        # set it to some value
        self.contents.set("this is a variable")
        # tell the entry widget to watch this variable
        self.entrythingy["textvariable"] = self.contents

        # and here we get a callback when the user hits return.
        # we will have the program print out the value of the
        # application variable when the user hits return
        self.entrythingy.bind('<Key-Return>',
                              self.print_contents)

    def print_contents(self, event):
        print "hi. contents of entry is now ---->", \
              self.contents.get()

6.5. Диспетчер окон

В Tk есть служебная команда wm, позволяющая взаимодействовать с диспетчером окон. Опции команды wm позволяют управлять такими параметрами, как заголовки, расположение, значки и т. п. В Tkinter эти команды реализованы как методы класса Wm. Виджеты верхнего уровня наследуются от класса Wm и поэтому могут напрямую вызывать методы Wm.

Чтобы получить окно верхнего уровня, содержащее определённый виджет, часто достаточно обратиться к master виджета. Конечно, если виджет был размещён внутри фрейма, master не будет представлять окно верхнего уровня. Чтобы получить окно верхнего уровня, содержащее произвольный виджет, можно вызвать метод _root(). Этот метод начинается с символа подчеркивания, чтобы указать, что эта функция является частью реализации, а не интерфейсом к функциональности Tk.

Вот несколько примеров типичного использования:

from Tkinter import *
class App(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()


# create the application
myapp = App()

#
# here are method calls to the window manager class
#
myapp.master.title("My Do-Nothing Application")
myapp.master.maxsize(1000, 400)

# start the program
myapp.mainloop()

6.6. Типы данных опций Tk

anchor

Допустимые значения — точки компаса: "n", "ne", "e", "se", "s", "sw", "w", "nw", а также "center".

bitmap

Существует восемь встроенных значков-битовых карт: 'error', 'gray25', 'gray50', 'hourglass', 'info', 'questhead', 'question', 'warning'. Чтобы указать имя файла X-битовой карты, укажите полный путь к файлу, предваряемый @, как в "@/usr/contrib/bitmap/gumby.bit".

boolean

Можно передать целые числа 0 или 1 или строки "yes" или "no".

callback

Любая функция Python, которая не принимает аргументов. Например:

def print_it():
        print "hi there"
fred["command"] = print_it
color

Цвета можно задать как названия цветов X в файле rgb.txt, или как строки, представляющие значения RGB в 4-битовом: "#RGB", 8-битовом: "#RRGGBB", 12-битовом "#RRRGGGBBB", или 16-битовом "#RRRRGGGGBBBB" диапазонах, где R, G, B — любые допустимые шестнадцатеричные цифры. Подробности см. на странице 160 книги Аустерхаута.

cursor

Можно использовать стандартные имена курсоров X из cursorfont.h без префикса XC_. Например, для получения курсора руки (XC_hand2 ), используйте строку "hand2". Также можно указать собственный файл битовой карты и маски. См. страницу 179 книги Аустерхаута.

distance

Расстояния на экране можно задавать в пикселях или абсолютных единицах. Пиксели задаются числами, а абсолютные расстояния — строками с последующим символом, обозначающим единицы: c для сантиметров, i для дюймов, m для миллиметров, p для типографских пунктов. Например, 3.5 дюйма записываются как "3.5i".

font

Tk использует формат списка имён шрифтов, например {courier 10 bold}. Размеры шрифтов с положительными числами измеряются в пунктах; размеры с отрицательными числами — в пикселях.

geometry

Это строка вида widthxheight, где ширина и высота измеряются в пикселях для большинства виджетов (в символах для виджетов, отображающих текст). Например: fred["geometry"] = "200x100".

justify

Допустимые значения: "left", "center", "right", и "fill".

region

Это строка с четырьмя элементами, разделёнными пробелами, каждый из которых — допустимое расстояние (см. выше). Например: "2 3 4 5" и "3i 2i 4.5i 2i" и "3c 2c 4c 10.43c" — все допустимые области.

relief

Определяет стиль границы виджета. Допустимые значения: "raised", "sunken", "flat", "groove", и "ridge".

scrollcommand

Почти всегда это метод set() какого-либо виджета полосы прокрутки, но может быть любым методом виджета, принимающим один аргумент. См. файл Demo/tkinter/matt/canvas-with-scrollbars.py в дистрибутиве исходного кода Python для примера.

wrap:

Должно быть одним из: "none", "char", или "word".

6.7. Связки и события

Метод bind из команды виджета позволяет отслеживать определённые события и вызывать функцию обратного вызова, когда возникает событие указанного типа. Формат метода bind:

def bind(self, sequence, func, add=''):

где:

sequence

— строка, обозначающая целевой тип события. (Подробности см. в руководстве по bind и на странице 201 книги Джона Аусстерхаута).

func

— функция Python, принимающая один аргумент, которая вызывается при возникновении события. В качестве аргумента передаётся экземпляр Event. (Функции, используемые таким образом, обычно называются обработчиками).

add

— необязательно, либо '' или '+'. Передача пустой строки означает, что эта привязка должна заменить любые другие привязки, связанные с этим событием. Передача '+' означает, что эта функция должна быть добавлена в список функций, связанных с этим типом события.

Например:

def turnRed(self, event):
    event.widget["activeforeground"] = "red"

self.button.bind("<Enter>", self.turnRed)

Обратите внимание, как в обработчике turnRed() обращается к полю widget события. Это поле содержит виджет, который поймал событие X. В следующей таблице перечислены другие поля событий, к которым можно обратиться, и как они обозначены в Tk, что может быть полезно при работе со справочником Tk.

Tk      Tkinter Event Field             Tk      Tkinter Event Field
--      -------------------             --      -------------------
%f      focus                           %A      char
%h      height                          %E      send_event
%k      keycode                         %K      keysym
%s      state                           %N      keysym_num
%t      time                            %T      type
%w      width                           %W      widget
%x      x                               %X      x_root
%y      y                               %Y      y_root

6.8. Параметр index

Ряд виджетов требует параметра «index» для передачи. Он используется для указания определённого места в виджете Text или определённых символов в виджете Entry или определённых пунктов меню в виджете Menu.

Индексы виджета Entry (index, view index и т. д.)

Виджеты Entry имеют опции, которые относятся к позициям символов в отображаемом тексте. Можно использовать эти функции Tkinter для доступа к этим особым точкам в виджетах текста:

AtEnd()

ссылается на последнюю позицию в тексте

AtInsert()

ссылается на точку, где находится курсор текста

AtSelFirst()

указывает начальную точку выделенного текста

AtSelLast()

указывает последнюю точку выделенного текста

At(x[, y])

ссылается на символ в пиксельной позиции x, y (при этом y не используется в случае виджета ввода текста, содержащего одну строку).

Индексы виджета Text

Система обозначения индексов для виджетов Text очень богата и лучше всего описана в руководствах Tk.

Индексы меню (menu.invoke(), menu.entryconfig() и т. д.)

Некоторые опции и методы меню манипулируют определёнными пунктами меню. В любом случае, когда требуется индекс меню для опции или параметра, можно передать:

  • целое число, которое ссылается на числовую позицию пункта в виджете, считая сверху, начиная с 0;
  • строку 'active', которая ссылается на позицию меню, которая в данный момент находится под курсором;
  • строку "last", которая ссылается на последний пункт меню;
  • целое число, предваряемое @, как в @6, где целое число интерпретируется как координата y в пикселях в системе координат меню;
  • строку "none", которая указывает отсутствие пункта меню, чаще всего используемая с menu.activate() для деактивации всех пунктов, и наконец,
  • текстовую строку, которая сопоставляется с меткой пункта меню, сканируя меню сверху вниз. Обратите внимание, что этот тип индекса рассматривается после всех остальных, что означает, что совпадения для пунктов меню с метками last, active, или none могут быть интерпретированы как вышеупомянутые литералы, вместо этого.

6.9. Изображения

Изображения разных форматов могут быть созданы с помощью соответствующего подкласса Tkinter.Image.

  • BitmapImage для изображений в формате XBM.
  • PhotoImage для изображений в форматах PGM, PPM, GIF и PNG. Последний поддерживается начиная с Tk 8.6.

Изображение создаётся с помощью опции file или data (есть и другие опции).

Объект изображения можно использовать там, где поддерживается опция image (например, в метках, кнопках, меню). В этих случаях Tk не будет хранить ссылку на изображение. Когда последняя ссылка на объект изображения в Python удаляется, данные изображения также удаляются, и Tk отобразит пустую область там, где было изображение.

См. также

Пакет Pillow добавляет поддержку форматов BMP, JPEG, TIFF и WebP, а также других.

7. Обработчики файлов

Tk позволяет зарегистрировать и отменить регистрацию функции обратного вызова, которая будет вызываться из Tk mainloop, когда доступны ввод-вывод для дескриптора файла. Только один обработчик может быть зарегистрирован на один дескриптор файла. Пример кода:

import Tkinter
widget = Tkinter.Tk()
mask = Tkinter.READABLE | Tkinter.WRITABLE
widget.tk.createfilehandler(file, mask, callback)
...
widget.tk.deletefilehandler(file)

Эта функция недоступна в Windows.

Поскольку вы не знаете, сколько байтов доступно для чтения, вы можете не захотеть использовать методы BufferedIOBase или TextIOBase read() или readline(), так как они будут настаивать на чтении предварительно определённого количества байтов. Для сокетов методы recv() или recvfrom() подойдут; для других файлов используйте чтение сырых данных или os.read(file.fileno(), maxbytecount).

Widget.tk.createfilehandler(file, mask, func)

Регистрирует функцию обратного вызова обработчика файла func. Аргумент file может быть объектом с методом fileno() (например, объектом файла или сокета) или целым числом — дескриптором файла. Аргумент mask — логическое ИЛИ из любых трёх констант ниже. Функция обратного вызова вызывается следующим образом:

callback(file, mask)
Widget.tk.deletefilehandler(file)

Отменяет регистрацию обработчика файла.

Tkinter.READABLE
Tkinter.WRITABLE
Tkinter.EXCEPTION

Константы, используемые в аргументах mask.

© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/2.7/library/tkinter.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API