tkinter — Python interface to Tcl/Tk

Вихідний код: Lib/tkinter/__init__.py


Пакет tkinter («інтерфейс Tk») є стандартним інтерфейсом Python до інструментарію GUI Tcl/Tk. І Tk, і tkinter доступні на більшості платформ Unix, включаючи macOS, а також у системах Windows.

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

Дивись також

  • TkDocs

    Розширений підручник зі створення інтерфейсів користувача за допомогою Tkinter. Пояснює ключові концепції та ілюструє рекомендовані підходи за допомогою сучасного API.

  • Довідник Tkinter 8.5: графічний інтерфейс для Python

    Довідкова документація для Tkinter 8.5 із детальним описом доступних класів, методів і параметрів.

Ресурси Tcl/Tk:

  • Tk команди

    Вичерпне посилання на кожну з базових команд Tcl/Tk, що використовуються Tkinter.

  • Домашня сторінка Tcl/Tk

    Додаткова документація та посилання на розробку ядра Tcl/Tk.

Книги:

Модулі Tkinter

Підтримка Tkinter розподілена на кілька модулів. Для більшості програм знадобиться головний модуль tkinter, а також модуль tkinter.ttk, який надає сучасний тематичний набір віджетів і API:

from tkinter import *
from tkinter import ttk
class tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=True, sync=False, use=None)

Створіть віджет Tk верхнього рівня, який зазвичай є головним вікном програми, та ініціалізуйте інтерпретатор Tcl для цього віджета. Кожен екземпляр має власний асоційований інтерпретатор Tcl.

Клас Tk зазвичай створюється з використанням усіх значень за замовчуванням. Однак наразі розпізнаються такі аргументи ключових слів:

screenName

Якщо задано (у вигляді рядка), установлює змінну середовища DISPLAY. (лише X11)

базова назва

Ім’я файлу профілю. За замовчуванням baseName походить від назви програми (sys.argv[0]).

назва класу

Назва класу віджетів. Використовується як файл профілю, а також як ім’я, з яким викликається Tcl (argv0 у interp).

useTk

Якщо True, ініціалізувати підсистему Tk. Функція tkinter.Tcl() встановлює значення False.

синхронізація

Якщо True, виконувати всі команди X-сервера синхронно, щоб повідомляти про помилки негайно. Можна використовувати для налагодження. (лише X11)

використання

Визначає id вікна, у яке потрібно вставити програму, замість того, щоб воно створювалося як незалежне вікно верхнього рівня. id потрібно вказати так само, як значення параметра -use для віджетів верхнього рівня (тобто воно має форму, подібну до тієї, яку повертає winfo_id()).

Зауважте, що на деяких платформах це працюватиме належним чином, лише якщо id посилається на фрейм Tk або верхній рівень, для якого ввімкнено параметр -container.

Tk reads and interprets profile files, named .className.tcl and .baseName.tcl, into the Tcl interpreter and calls exec() on the contents of .className.py and .baseName.py. The path for the profile files is the HOME environment variable or, if that isn’t defined, then os.curdir.

tk

Об’єкт програми Tk, створений шляхом створення екземпляра Tk. Це забезпечує доступ до інтерпретатора Tcl. Кожен віджет, до якого приєднано той самий екземпляр Tk, має однакове значення для свого атрибута tk.

master

Об’єкт віджета, який містить цей віджет. Для Tk, master є None, оскільки це головне вікно. Терміни master і parent подібні та іноді використовуються як взаємозамінні назви аргументів; однак виклик winfo_parent() повертає рядок назви віджета, тоді як master повертає об’єкт. parent/child відображає деревоподібний зв’язок, тоді як master/slave відображає структуру контейнера.

children

Безпосередні нащадки цього віджета як dict з іменами дочірніх віджетів як ключі та дочірні об’єкти екземплярів як значення.

tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=False)

Функція Tcl() є фабричною функцією, яка створює об’єкт, подібний до створеного класом Tk, за винятком того, що вона не ініціалізує підсистему Tk. Це найчастіше корисно, коли керуєте інтерпретатором Tcl у середовищі, де не потрібно створювати сторонні вікна верхнього рівня або де це неможливо (наприклад, системи Unix/Linux без X-сервера). Для об’єкта, створеного об’єктом Tcl(), можна створити вікно верхнього рівня (та ініціалізувати підсистему Tk), викликавши його метод loadtk().

Модулі, які забезпечують підтримку Tk, включають:

tkinter

Головний модуль Tkinter.

tkinter.colorchooser

Діалогове вікно, у якому користувач може вибрати колір.

tkinter.commondialog

Базовий клас для діалогових вікон, визначених в інших модулях, перелічених тут.

tkinter.filedialog

Загальні діалоги, які дозволяють користувачеві вказати файл для відкриття або збереження.

tkinter.font

Утиліти для допомоги в роботі зі шрифтами.

tkinter.messagebox

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

tkinter.scrolledtext

Текстовий віджет із вбудованою вертикальною смугою прокручування.

tkinter.simpledialog

Основні діалоги та функції зручності.

tkinter.ttk

Тематичний набір віджетів, представлений у Tk 8.5, надає сучасні альтернативи для багатьох класичних віджетів у головному модулі tkinter.

Додаткові модулі:

_tkinter

Двійковий модуль, який містить низькорівневий інтерфейс для Tcl/Tk. Він автоматично імпортується головним модулем tkinter і ніколи не повинен використовуватися безпосередньо програмістами додатків. Зазвичай це спільна бібліотека (або DLL), але в деяких випадках може бути статично пов’язана з інтерпретатором Python.

idlelib

Інтегроване середовище розробки та навчання Python (IDLE). На основі tkinter.

tkinter.constants

Символічні константи, які можна використовувати замість рядків під час передачі різних параметрів викликам Tkinter. Автоматично імпортується основним модулем tkinter.

tkinter.dnd

(експериментальний) Підтримка перетягування для tkinter. Це стане застарілим, коли його буде замінено на Tk DND.

tkinter.tix

(deprecated) An older third-party Tcl/Tk package that adds several new widgets. Better alternatives for most can be found in tkinter.ttk.

turtle

Графіка Turtle у вікні Tk.

Tkinter Life Preserver

This section is not designed to be an exhaustive tutorial on either Tk or Tkinter. Rather, it is intended as a stop gap, providing some introductory orientation on the system.

Credits:

  • Tk was written by John Ousterhout while at Berkeley.

  • Tkinter was written by Steen Lumholt and Guido van Rossum.

  • This Life Preserver was written by Matt Conway at the University of Virginia.

  • The HTML rendering, and some liberal editing, was produced from a FrameMaker version by Ken Manheimer.

  • Fredrik Lundh elaborated and revised the class interface descriptions, to get them current with Tk 4.2.

  • Mike Clarkson converted the documentation to LaTeX, and compiled the User Interface chapter of the reference manual.

How To Use This Section

This section is designed in two parts: the first half (roughly) covers background material, while the second half can be taken to the keyboard as a handy reference.

When trying to answer questions of the form «how do I do blah», it is often best to find out how to do «blah» in straight Tk, and then convert this back into the corresponding tkinter call. Python programmers can often guess at the correct Python command by looking at the Tk documentation. This means that in order to use Tkinter, you will have to know a little bit about Tk. This document can’t fulfill that role, so the best we can do is point you to the best documentation that exists. Here are some hints:

  • The authors strongly suggest getting a copy of the Tk man pages. Specifically, the man pages in the manN directory are most useful. The man3 man pages describe the C interface to the Tk library and thus are not especially helpful for script writers.

  • Addison-Wesley publishes a book called Tcl and the Tk Toolkit by John Ousterhout (ISBN 0-201-63337-X) which is a good introduction to Tcl and Tk for the novice. The book is not exhaustive, and for many details it defers to the man pages.

  • tkinter/__init__.py is a last resort for most, but can be a good place to go when nothing else makes sense.

A Simple Hello World Program

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.hi_there = tk.Button(self)
        self.hi_there["text"] = "Hello World\n(click me)"
        self.hi_there["command"] = self.say_hi
        self.hi_there.pack(side="top")

        self.quit = tk.Button(self, text="QUIT", fg="red",
                              command=self.master.destroy)
        self.quit.pack(side="bottom")

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

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

A (Very) Quick Look at Tcl/Tk

The class hierarchy looks complicated, but in actual practice, application programmers almost always refer to the classes at the very bottom of the hierarchy.

Notes:

  • These classes are provided for the purposes of organizing certain functions under one namespace. They aren’t meant to be instantiated independently.

  • The Tk class is meant to be instantiated only once in an application. Application programmers need not instantiate one explicitly, the system creates one whenever any of the other classes are instantiated.

  • The Widget class is not meant to be instantiated, it is meant only for subclassing to make «real» widgets (in C++, this is called an „abstract class“).

To make use of this reference material, there will be times when you will need to know how to read short passages of Tk and how to identify the various parts of a Tk command. (See section Mapping Basic Tk into Tkinter for the tkinter equivalents of what’s below.)

Tk scripts are Tcl programs. Like all Tcl programs, Tk scripts are just lists of tokens separated by spaces. A Tk widget is just its class, the options that help configure it, and the actions that make it do useful things.

To make a widget in Tk, the command is always of the form:

classCommand newPathname options
classCommand

denotes which kind of widget to make (a button, a label, a menu…)

newPathname

is the new name for this widget. All names in Tk must be unique. To help enforce this, widgets in Tk are named with pathnames, just like files in a file system. The top level widget, the root, is called . (period) and children are delimited by more periods. For example, .myApp.controlPanel.okButton might be the name of a widget.

options

configure the widget’s appearance and in some cases, its behavior. The options come in the form of a list of flags and values. Flags are preceded by a „-„, like Unix shell command flags, and values are put in quotes if they are more than one word.

Наприклад:

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

Once created, the pathname to the widget becomes a new command. This new widget command is the programmer’s handle for getting the new widget to perform some action. In C, you’d express this as someAction(fred, someOptions), in C++, you would express this as fred.someAction(someOptions), and in Tk, you say:

.fred someAction someOptions

Note that the object name, .fred, starts with a dot.

As you’d expect, the legal values for someAction will depend on the widget’s class: .fred disable works if fred is a button (fred gets greyed out), but does not work if fred is a label (disabling of labels is not supported in Tk).

The legal values of someOptions is action dependent. Some actions, like disable, require no arguments, others, like a text-entry box’s delete command, would need arguments to specify what range of text to delete.

Mapping Basic Tk into Tkinter

Class commands in Tk correspond to class constructors in Tkinter.

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

The master of an object is implicit in the new name given to it at creation time. In Tkinter, masters are specified explicitly.

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

The configuration options in Tk are given in lists of hyphened tags followed by values. In Tkinter, options are specified as keyword-arguments in the instance constructor, and keyword-args for configure calls or as instance indices, in dictionary style, for established instances. See section Параметри налаштування on setting options.

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

In Tk, to perform an action on a widget, use the widget name as a command, and follow it with an action name, possibly with arguments (options). In Tkinter, you call methods on the class instance to invoke actions on the widget. The actions (methods) that a given widget can perform are listed in tkinter/__init__.py.

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

To give a widget to the packer (geometry manager), you call pack with optional arguments. In Tkinter, the Pack class holds all this functionality, and the various forms of the pack command are implemented as methods. All widgets in tkinter are subclassed from the Packer, and so inherit all the packing methods. See the tkinter.tix module documentation for additional information on the Form geometry manager.

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

Зручний довідник

Параметри налаштування

Параметри контролюють такі речі, як колір і ширина рамки віджета. Параметри можна встановити трьома способами:

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

Щоб отримати повне пояснення даного параметра та його поведінки, перегляньте сторінки довідки Tk для відповідного віджета.

Зауважте, що на довідкових сторінках перераховано «СТАНДАРТНІ ПАРАМЕТРИ» та «СПЕЦИФІЧНІ ПАРАМЕТРИ ВІДЖЕТА» для кожного віджета. Перший — це список параметрів, які є спільними для багатьох віджетів, другий — параметри, які є ідіосинкратичними для цього конкретного віджета. Стандартні параметри задокументовані на сторінці довідки options(3).

У цьому документі не робиться різниці між стандартними параметрами та параметрами, що стосуються окремих віджетів. Деякі параметри не застосовуються до деяких типів віджетів. Чи відповідає даний віджет певній опції, залежить від класу віджета; кнопки мають параметр команда, а мітки — ні.

Параметри, які підтримує певний віджет, перераховані на сторінці довідки цього віджета, або їх можна запитати під час виконання, викликавши метод config() без аргументів або викликавши метод keys() у цьому віджеті. Поверненим значенням цих викликів є словник, ключем якого є ім’я опції у вигляді рядка (наприклад, 'relief'), а значеннями є 5-ти кортежі.

Деякі параметри, як-от bg, є синонімами поширених параметрів із довгими назвами (bg є скороченням від «фон»). Передача методу config() імені скороченого параметра поверне 2-кортеж, а не 5-кортеж. 2-кортеж, переданий назад, міститиме назву синоніму та «справжній» параметр (наприклад, ('bg', 'background')).

Індекс

Значення

приклад

0

назва опції

''рельєф'

1

назва параметра для пошуку в базі даних

''рельєф'

2

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

'Рельєф'

3

значення за замовчуванням

'піднятий''

4

поточне значення

'канавки'

Приклад:

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

Звичайно, надрукований словник міститиме всі доступні варіанти та їхні значення. Це лише як приклад.

Пакувальник

Пакер є одним із механізмів управління геометрією Tk. Менеджери геометрії використовуються для вказівки відносного розташування віджетів у їхньому контейнері - їхньому спільному master. На відміну від більш громіздкого розсипу (який використовується рідше, і ми не розглядаємо його тут), пакувальник бере якісну специфікацію зв’язку – вгорі, ліворуч, заповнення тощо – і працює все, щоб визначити для вас точні координати розміщення.

Розмір будь-якого головного віджета визначається розміром «підлеглих віджетів» усередині. Пакувальник використовується для керування тим, де підпорядковані віджети з’являються всередині головного, у який вони упаковані. Ви можете запакувати віджети у фрейми, а фрейми – в інші фрейми, щоб отримати потрібний вам макет. Крім того, компонування динамічно налаштовується для врахування поступових змін конфігурації після того, як воно упаковане.

Зауважте, що віджети не з’являться, доки їхню геометрію не буде визначено за допомогою менеджера геометрії. Поширеною ранньою помилкою є пропуск специфікації геометрії, а потім дивуватися, коли віджет створено, але нічого не з’явиться. Віджет з’явиться лише після того, як до нього буде застосовано, наприклад, метод пакувальника pack().

Метод pack() можна викликати за допомогою пар ключове слово-параметр/значення, які визначають, де віджет має з’являтися в своєму контейнері та як він має поводитися, коли змінюється розмір головного вікна програми. Ось кілька прикладів:

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

Опції пакувальника

Щоб отримати докладнішу інформацію про пакувальник і параметри, які він може приймати, перегляньте сторінки довідки та сторінку 183 книги Джона Оустерхаута.

якір

Якірний тип. Позначає, де пакувальник має розмістити кожного підлеглого у своїй посилці.

розширити

Логічне значення, 0 або 1.

заповнити

Правильні значення: 'x', 'y', 'both', 'none'.

ipadx і ipady

Відстань — позначення внутрішнього відступу з кожного боку підлеглого віджета.

padx і pady

Відстань — позначення зовнішніх відступів з кожного боку підлеглого віджета.

бік

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

З’єднання змінних віджетів

Налаштування поточного значення деяких віджетів (наприклад, віджетів для введення тексту) можна підключити безпосередньо до змінних програми за допомогою спеціальних параметрів. Ці параметри: variable, textvariable, onvalue, offvalue і value. Це підключення працює в обох напрямках: якщо змінна змінюється з будь-якої причини, віджет, до якого вона підключена, буде оновлено, щоб відобразити нове значення.

На жаль, у поточній реалізації tkinter неможливо передати довільну змінну Python у віджет за допомогою опції variable або textvariable. Єдині типи змінних, для яких це працює, це змінні, які є підкласами класу під назвою Variable, визначеного в tkinter.

Уже визначено багато корисних підкласів Variable: StringVar, IntVar, DoubleVar і BooleanVar. Щоб прочитати поточне значення такої змінної, викличте для неї метод get(), а щоб змінити її значення, викличте метод set(). Якщо ви дотримуєтеся цього протоколу, віджет завжди відстежуватиме значення змінної без подальшого втручання з вашого боку.

Наприклад:

import tkinter as tk

class App(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.pack()

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

        # Create the application variable.
        self.contents = tk.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

        # Define a callback for when the user hits return.
        # It prints the current value of the variable.
        self.entrythingy.bind('<Key-Return>',
                             self.print_contents)

    def print_contents(self, event):
        print("Hi. The current entry content is:",
              self.contents.get())

root = tk.Tk()
myapp = App(root)
myapp.mainloop()

Менеджер вікон

У Tk є службова команда wm для взаємодії з менеджером вікон. Параметри команди wm дозволяють керувати такими речами, як заголовки, розташування, растрові зображення піктограм тощо. У tkinter ці команди реалізовано як методи класу Wm. Віджети верхнього рівня є підкласами класу Wm, тому можуть безпосередньо викликати методи Wm.

Щоб отримати доступ до вікна верхнього рівня, яке містить даний віджет, ви часто можете просто звернутися до майстра віджета. Звичайно, якщо віджет було упаковано всередину фрейму, майстер не представлятиме вікно верхнього рівня. Щоб отримати доступ до вікна верхнього рівня, яке містить довільний віджет, ви можете викликати метод _root(). Цей метод починається з підкреслення, щоб позначити той факт, що ця функція є частиною реалізації, а не інтерфейсом до функціональності Tk.

Ось кілька прикладів типового використання:

import tkinter as tk

class App(tk.Frame):
    def __init__(self, master=None):
        super().__init__(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()

Типи даних параметрів Tk

якір

Правовими значеннями є точки компаса: "n", "ne", "e", "se", "s", "sw", "w", "nw", а також "center".

растрове зображення

Є вісім вбудованих іменованих растрових зображень: 'error', 'gray25', 'gray50', 'hourglass', 'info', 'questhead', 'питання', 'попередження''. Щоб вказати ім’я файлу растрового зображення X, укажіть повний шлях до файлу, перед яким стоїть @, як у "@/usr/contrib/bitmap/gumby.bit".

логічний

Ви можете передати цілі числа 0 або 1 або рядки "yes" чи "no".

зворотній дзвінок

Це будь-яка функція Python, яка не приймає аргументів. Наприклад:

def print_it():
    print("hi there")
fred["command"] = print_it
колір

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

курсор

Можна використовувати стандартні імена курсорів X із cursorfont.h без префікса XC_. Наприклад, щоб отримати курсор руки (XC_hand2), використовуйте рядок "hand2". Ви також можете вказати власний растровий файл і файл маски. Дивіться сторінку 179 книги Оустерхаута.

відстань

Відстань до екрана можна вказати як у пікселях, так і в абсолютних відстанях. Пікселі подаються у вигляді чисел, а абсолютні відстані – у вигляді рядків із кінцевим символом, що позначає одиниці: c для сантиметрів, i для дюймів, m для міліметрів, p для точок принтера . Наприклад, 3,5 дюйма виражається як "3,5i".

шрифт

Tk використовує формат назви шрифту списку, наприклад {courier 10 bold}. Розмір шрифту з додатними числами вимірюється в пунктах; розміри з від’ємними числами вимірюються в пікселях.

геометрія

Це рядок у формі ширинаxвисота, де ширина та висота вимірюються в пікселях для більшості віджетів (у символах для віджетів, що відображають текст). Наприклад: fred["geometry"] = "200x100".

виправдати

Правильними значеннями є рядки: "left", "center", "right" і "fill".

область

Це рядок із чотирма розділеними пробілами елементами, кожен із яких є допустимою відстанню (див. вище). Наприклад: "2 3 4 5" і "3i 2i 4.5i 2i" і "3c 2c 4c 10.43c" є законними регіонами.

полегшення

Визначає, яким буде стиль межі віджета. Допустимі значення: "піднятий", "заглиблений", "плоский", "канавка" і "гребінь".

команда прокручування

Це майже завжди метод set() якогось віджета смуги прокрутки, але це може бути будь-який метод віджета, який приймає один аргумент.

загорнути

Має бути одне з: "none", "char" або "word".

Прив’язки та події

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

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

де:

послідовність

is a string that denotes the target kind of event. (See the bind man page and page 201 of John Ousterhout’s book for details).

функц

це функція Python, яка приймає один аргумент, який викликається, коли відбувається подія. Екземпляр події буде передано як аргумент. (Функції, розгорнуті таким чином, широко відомі як зворотні виклики.)

додати

є необов’язковим, або '' або '+'. Передача порожнього рядка означає, що ця прив’язка має замінити будь-які інші прив’язки, з якими пов’язана ця подія. Передача '+' означає, що цю функцію потрібно додати до списку функцій, пов’язаних із цим типом події.

Наприклад:

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

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

Зверніть увагу, як у зворотному виклику turn_red() здійснюється доступ до поля віджета події. Це поле містить віджет, який перехопив подію X. У наведеній нижче таблиці перераховано інші поля подій, до яких ви можете отримати доступ, і те, як вони позначаються в Tk, що може бути корисним під час звернення до довідкових сторінок Tk.

Тк

Поле подій Tkinter

Тк

Поле подій Tkinter

%f

фокус

%A

char

%h

висота

%E

send_event

%k

код ключа

%K

keysym

%s

стан

%N

keysym_num

%t

час

%T

типу

%w

ширина

%W

віджет

%x

x

%X

x_root

%y

р

%Y

y_root

Параметр індексу

Кілька віджетів потребують передачі параметрів «index». Вони використовуються для вказівки на певне місце у віджеті «Текст», або на певні символи у віджеті «Вхід», або на певні пункти меню у віджеті «Меню».

Індекси віджетів запису (індекс, індекс перегляду тощо)

Віджети запису мають параметри, які стосуються позицій символів у тексті, що відображається. Ви можете використовувати ці функції tkinter для доступу до цих спеціальних пунктів у текстових віджетах:

Індекси текстових віджетів

Нотація покажчика для текстових віджетів дуже багата і найкраще описана на сторінках керівництва Tk.

Індекси меню (menu.invoke(), menu.entryconfig() тощо)

Деякі параметри та методи для меню маніпулюють певними записами меню. Щоразу, коли для опції чи параметра потрібен індекс меню, ви можете передати:

  • ціле число, яке відноситься до числової позиції запису у віджеті, починаючи з 0;

  • рядок "active", який посилається на позицію меню, яка зараз знаходиться під курсором;

  • рядок "last", який посилається на останній пункт меню;

  • Ціле число, якому передує @, як у @6, де ціле число інтерпретується як координата y пікселя в системі координат меню;

  • рядок "none", який вказує на те, що в меню взагалі немає запису, найчастіше використовується з menu.activate(), щоб дезактивувати всі записи, і, нарешті,

  • текстовий рядок, який зіставляється з міткою запису меню, відсканований від верхньої частини меню донизу. Зауважте, що цей тип індексу розглядається після всіх інших, що означає, що збіги для пунктів меню, позначених як останній, активний або жоден, замість цього можуть інтерпретуватися як наведені вище літерали.

Зображення

Зображення різних форматів можна створювати за допомогою відповідного підкласу tkinter.Image:

  • BitmapImage для зображень у форматі XBM.

  • PhotoImage для зображень у форматах PGM, PPM, GIF і PNG. Останній підтримується, починаючи з Tk 8.6.

Будь-який тип зображення створюється за допомогою параметра file або data (інші параметри також доступні).

Потім об’єкт зображення можна використовувати скрізь, де параметр image підтримується деяким віджетом (наприклад, мітки, кнопки, меню). У цих випадках Tk не зберігатиме посилання на зображення. Коли останнє посилання Python на об’єкт зображення видаляється, дані зображення також видаляються, і Tk відображатиме порожнє поле, де б зображення не використовувалося.

Дивись також

The Pillow package adds support for formats such as BMP, JPEG, TIFF, and WebP, among others.

Обробники файлів

Tk дозволяє вам зареєструвати та скасувати реєстрацію функції зворотного виклику, яка буде викликана з основного циклу Tk, коли введення/виведення можливе для дескриптора файлу. Для кожного дескриптора файлу можна зареєструвати лише один обробник. Приклад коду:

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.