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 для зайнятих розробників Python
Автор: Марк Розман. (ISBN 978-1999149567)
- Python and Tkinter Programming
By Alan Moore. (ISBN 978-1788835886)
- Programming Python
Марк Лутц; має чудове покриття Tkinter. (ISBN 978-0596158101)
- Tcl і Tk Toolkit (2-е видання)
Джон Остерхаут, винахідник Tcl/Tk, і Кен Джонс; не охоплює Tkinter. (ISBN 978-0321336330)
Модулі 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 callsexec()
on the contents of.className.py
and.baseName.py
. The path for the profile files is theHOME
environment variable or, if that isn’t defined, thenos.curdir
.-
tk
¶ Об’єкт програми Tk, створений шляхом створення екземпляра
Tk
. Це забезпечує доступ до інтерпретатора Tcl. Кожен віджет, до якого приєднано той самий екземплярTk
, має однакове значення для свого атрибутаtk
.
-
master
¶ Об’єкт віджета, який містить цей віджет. Для
Tk
, master єNone
, оскільки це головне вікно. Терміни master і parent подібні та іноді використовуються як взаємозамінні назви аргументів; однак викликwinfo_parent()
повертає рядок назви віджета, тоді якmaster
повертає об’єкт. parent/child відображає деревоподібний зв’язок, тоді як master/slave відображає структуру контейнера.
-
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. Theman3
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)¶ Скасовує реєстрацію обробника файлів.