tkinter --- Python interface to Tcl/Tk

Kod źródłowy: Lib/tkinter/__init__.py


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

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

Tkinter supports a range of Tcl/Tk versions, built either with or without thread support. The official Python binary release bundles Tcl/Tk 8.6 threaded. See the source code for the _tkinter module for more information about supported versions.

Tkinter is not a thin wrapper, but adds a fair amount of its own logic to make the experience more pythonic. This documentation will concentrate on these additions and changes, and refer to the official Tcl/Tk documentation for details that are unchanged.

Catatan

Tcl/Tk 8.5 (2007) introduced a modern set of themed user interface components along with a new API to use them. Both old and new APIs are still available. Most documentation you will find online still uses the old API and can be woefully outdated.

Lihat juga

  • TkDocs

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

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

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

Ресурси Tcl/Tk:

  • Tk команди

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

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

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

Книги:

Architecture

Tcl/Tk is not a single library but rather consists of a few distinct modules, each with separate functionality and its own official documentation. Python's binary releases also ship an add-on module together with it.

Tcl

Tcl is a dynamic interpreted programming language, just like Python. Though it can be used on its own as a general-purpose programming language, it is most commonly embedded into C applications as a scripting engine or an interface to the Tk toolkit. The Tcl library has a C interface to create and manage one or more instances of a Tcl interpreter, run Tcl commands and scripts in those instances, and add custom commands implemented in either Tcl or C. Each interpreter has an event queue, and there are facilities to send events to it and process them. Unlike Python, Tcl's execution model is designed around cooperative multitasking, and Tkinter bridges this difference (see Threading model for details).

Тк

Tk is a Tcl package implemented in C that adds custom commands to create and manipulate GUI widgets. Each Tk object embeds its own Tcl interpreter instance with Tk loaded into it. Tk's widgets are very customizable, though at the cost of a dated appearance. Tk uses Tcl's event queue to generate and process GUI events.

Ttk

Themed Tk (Ttk) is a newer family of Tk widgets that provide a much better appearance on different platforms than many of the classic Tk widgets. Ttk is distributed as part of Tk, starting with Tk version 8.5. Python bindings are provided in a separate module, tkinter.ttk.

Internally, Tk and Ttk use facilities of the underlying operating system, i.e., Xlib on Unix/X11, Cocoa on macOS, GDI on Windows.

When your Python application uses a class in Tkinter, e.g., to create a widget, the tkinter module first assembles a Tcl/Tk command string. It passes that Tcl command string to an internal _tkinter binary module, which then calls the Tcl interpreter to evaluate it. The Tcl interpreter will then call into the Tk and/or Ttk packages, which will in turn make calls to Xlib, Cocoa, or GDI.

Модулі 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.

turtle

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

Tkinter Life Preserver

This section is not designed to be an exhaustive tutorial on either Tk or Tkinter. For that, refer to one of the external resources noted earlier. Instead, this section provides a very quick orientation to what a Tkinter application looks like, identifies foundational Tk concepts, and explains how the Tkinter wrapper is structured.

The remainder of this section will help you to identify the classes, methods, and options you'll need in your Tkinter application, and where to find more detailed documentation on them, including in the official Tcl/Tk reference manual.

A Hello World Program

We'll start by walking through a "Hello World" application in Tkinter. This isn't the smallest one we could write, but has enough to illustrate some key concepts you'll need to know.

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()

After the imports, the next line creates an instance of the Tk class, which initializes Tk and creates its associated Tcl interpreter. It also creates a toplevel window, known as the root window, which serves as the main window of the application.

The following line creates a frame widget, which in this case will contain a label and a button we'll create next. The frame is fit inside the root window.

The next line creates a label widget holding a static text string. The grid() method is used to specify the relative layout (position) of the label within its containing frame widget, similar to how tables in HTML work.

A button widget is then created, and placed to the right of the label. When pressed, it will call the destroy() method of the root window.

Finally, the mainloop() method puts everything on the display, and responds to user input until the program terminates.

Important Tk Concepts

Even this simple program illustrates the following key Tk concepts:

widgets

A Tkinter user interface is made up of individual widgets. Each widget is represented as a Python object, instantiated from classes like ttk.Frame, ttk.Label, and ttk.Button.

widget hierarchy

Widgets are arranged in a hierarchy. The label and button were contained within a frame, which in turn was contained within the root window. When creating each child widget, its parent widget is passed as the first argument to the widget constructor.

configuration options

Widgets have configuration options, which modify their appearance and behavior, such as the text to display in a label or button. Different classes of widgets will have different sets of options.

geometry management

Widgets aren't automatically added to the user interface when they are created. A geometry manager like grid controls where in the user interface they are placed.

event loop

Tkinter reacts to user input, changes from your program, and even refreshes the display only when actively running an event loop. If your program isn't running the event loop, your user interface won't update.

Understanding How Tkinter Wraps Tcl/Tk

When your application uses Tkinter's classes and methods, internally Tkinter is assembling strings representing Tcl/Tk commands, and executing those commands in the Tcl interpreter attached to your application's Tk instance.

Whether it's trying to navigate reference documentation, trying to find the right method or option, adapting some existing code, or debugging your Tkinter application, there are times that it will be useful to understand what those underlying Tcl/Tk commands look like.

To illustrate, here is the Tcl/Tk equivalent of the main part of the Tkinter script above.

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0

Tcl's syntax is similar to many shell languages, where the first word is the command to be executed, with arguments to that command following it, separated by spaces. Without getting into too many details, notice the following:

  • The commands used to create widgets (like ttk::frame) correspond to widget classes in Tkinter.

  • Tcl widget options (like -text) correspond to keyword arguments in Tkinter.

  • Widgets are referred to by a pathname in Tcl (like .frm.btn), whereas Tkinter doesn't use names but object references.

  • A widget's place in the widget hierarchy is encoded in its (hierarchical) pathname, which uses a . (dot) as a path separator. The pathname for the root window is just . (dot). In Tkinter, the hierarchy is defined not by pathname but by specifying the parent widget when creating each child widget.

  • Operations which are implemented as separate commands in Tcl (like grid or destroy) are represented as methods on Tkinter widget objects. As you'll see shortly, at other times Tcl uses what appear to be method calls on widget objects, which more closely mirror what would is used in Tkinter.

How do I...? What option does...?

If you're not sure how to do something in Tkinter, and you can't immediately find it in the tutorial or reference documentation you're using, there are a few strategies that can be helpful.

First, remember that the details of how individual widgets work may vary across different versions of both Tkinter and Tcl/Tk. If you're searching documentation, make sure it corresponds to the Python and Tcl/Tk versions installed on your system.

When searching for how to use an API, it helps to know the exact name of the class, option, or method that you're using. Introspection, either in an interactive Python shell or with print(), can help you identify what you need.

To find out what configuration options are available on any widget, call its configure() method, which returns a dictionary containing a variety of information about each object, including its default and current values. Use keys() to get just the names of each option.

btn = ttk.Button(frm, ...)
print(btn.configure().keys())

As most widgets have many configuration options in common, it can be useful to find out which are specific to a particular widget class. Comparing the list of options to that of a simpler widget, like a frame, is one way to do that.

print(set(btn.configure().keys()) - set(frm.configure().keys()))

Similarly, you can find the available methods for a widget object using the standard dir() function. If you try it, you'll see there are over 200 common widget methods, so again identifying those specific to a widget class is helpful.

print(dir(btn))
print(set(dir(btn)) - set(dir(frm)))

Threading model

Python and Tcl/Tk have very different threading models, which tkinter tries to bridge. If you use threads, you may need to be aware of this.

A Python interpreter may have many threads associated with it. In Tcl, multiple threads can be created, but each thread has a separate Tcl interpreter instance associated with it. Threads can also create more than one interpreter instance, though each interpreter instance can be used only by the one thread that created it.

Each Tk object created by tkinter contains a Tcl interpreter. It also keeps track of which thread created that interpreter. Calls to tkinter can be made from any Python thread. Internally, if a call comes from a thread other than the one that created the Tk object, an event is posted to the interpreter's event queue, and when executed, the result is returned to the calling Python thread.

Tcl/Tk applications are normally event-driven, meaning that after initialization, the interpreter runs an event loop (i.e. Tk.mainloop()) and responds to events. Because it is single-threaded, event handlers must respond quickly, otherwise they will block other events from being processed. To avoid this, any long-running computations should not run in an event handler, but are either broken into smaller pieces using timers, or run in another thread. This is different from many GUI toolkits where the GUI runs in a completely separate thread from all application code including event handlers.

If the Tcl interpreter is not running the event loop and processing events, any tkinter calls made from threads other than the one running the Tcl interpreter will fail.

A number of special cases exist:

  • Tcl/Tk libraries can be built so they are not thread-aware. In this case, tkinter calls the library from the originating Python thread, even if this is different than the thread that created the Tcl interpreter. A global lock ensures only one call occurs at a time.

  • While tkinter allows you to create more than one instance of a Tk object (with its own interpreter), all interpreters that are part of the same thread share a common event queue, which gets ugly fast. In practice, don't create more than one instance of Tk at a time. Otherwise, it's best to create them in separate threads and ensure you're running a thread-aware Tcl/Tk build.

  • Blocking event handlers are not the only way to prevent the Tcl interpreter from reentering the event loop. It is even possible to run multiple nested event loops or abandon the event loop entirely. If you're doing anything tricky when it comes to events or threads, be aware of these possibilities.

  • There are a few select tkinter functions that presently work only when called from the thread that created the Tcl interpreter.

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

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

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

Під час створення об’єкта, використовуючи ключові аргументи
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')).

Indeks

Artinya

Contoh

0

nama opsi

''рельєф'

1

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

''рельєф'

2

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

'Рельєф'

3

nilai bawaan

'піднятий''

4

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

'канавки'

Contoh:

>>> 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.

fill

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

ipadx і ipady

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

padx і pady

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

side

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

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

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

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

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

Sebagai contoh:

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".

wywołanie zwrotne

Це будь-яка функція 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 книги Оустерхаута.

kursor

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

відстань

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

font

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=''):

де:

urutan

is a string that denotes the target kind of event. (See the bind(3tk) man page, and page 201 of John Ousterhout's book, Tcl and the Tk Toolkit (2nd edition), for details).

func

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

add

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

Sebagai contoh:

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

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

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

Тк

Поле подій Tkinter

Тк

Поле подій Tkinter

%f

fokus

%A

char

%h

tinggi

%E

send_event

%k

keycode

%K

keysym

%s

стан

%N

keysym_num

%t

time

%T

tipe

%w

lebar

%W

віджет

%x

x

%X

x_root

%y

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 (інші параметри також доступні).

Berubah pada versi 3.13: Added the PhotoImage method copy_replace() to copy a region from one image to other image, possibly with pixel zooming and/or subsampling. Add from_coords parameter to PhotoImage methods copy(), zoom() and subsample(). Add zoom and subsample parameters to PhotoImage method copy().

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

Lihat juga

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.