tkinter
— Python interface to Tcl/Tk¶
Вихідний код: Lib/tkinter/__init__.py
The tkinter
package («Tk interface») is the standard Python interface to
the Tk GUI toolkit. Both Tk and tkinter
are available on most Unix
platforms, as well as on Windows systems. (Tk itself is not part of Python; it
is maintained at ActiveState.)
Запуск python -m tkinter
з командного рядка має відкрити вікно, яке демонструє простий інтерфейс Tk, повідомляючи, що tkinter
правильно встановлено у вашій системі, а також показує, яка версія Tcl/Tk встановлено, тому ви можете прочитати документацію Tcl/Tk, що стосується цієї версії.
Дивись також
Tkinter documentation:
- Python Tkinter Resources
The Python Tkinter Topic Guide provides a great deal of information on using Tk from Python and links to other sources of information on Tk.
- TKDocs
Extensive tutorial plus friendlier widget pages for some of the widgets.
- Довідник Tkinter 8.5: графічний інтерфейс для Python
On-line reference material.
- Tkinter docs from effbot
Online reference for tkinter supported by effbot.org.
- Programming Python
Book by Mark Lutz, has excellent coverage of Tkinter.
- Modern Tkinter for Busy Python Developers
Book by Mark Roseman about building attractive and modern graphical user interfaces with Python and Tkinter.
- Python and Tkinter Programming
Book by John Grayson (ISBN 1-884777-81-3).
Tcl/Tk documentation:
- Tk команди
Most commands are available as
tkinter
ortkinter.ttk
classes. Change „8.6“ to match the version of your Tcl/Tk installation.- Tcl/Tk recent man pages
Recent Tcl/Tk manuals on www.tcl.tk.
- ActiveState Tcl Home Page
The Tk/Tcl development is largely taking place at ActiveState.
- Tcl and the Tk Toolkit
Book by John Ousterhout, the inventor of Tcl.
- Practical Programming in Tcl and Tk
Brent Welch’s encyclopedic book.
Модулі Tkinter¶
Most of the time, tkinter
is all you really need, but a number of
additional modules are available as well. The Tk interface is located in a
binary module named _tkinter
. This module contains the low-level
interface to Tk, and should never be used directly by application programmers.
It is usually a shared library (or DLL), but might in some cases be statically
linked with the Python interpreter.
In addition to the Tk interface module, tkinter
includes a number of
Python modules, tkinter.constants
being one of the most important.
Importing tkinter
will automatically import tkinter.constants
,
so, usually, to use Tkinter all you need is a simple import statement:
import tkinter
Or, more often:
from tkinter import *
-
class
tkinter.
Tk
(screenName=None, baseName=None, className='Tk', useTk=1)¶ The
Tk
class is instantiated without arguments. This creates a toplevel widget of Tk which usually is the main window of an application. Each instance has its own associated Tcl interpreter.
-
tkinter.
Tcl
(screenName=None, baseName=None, className='Tk', useTk=0)¶ Функція
Tcl()
є фабричною функцією, яка створює об’єкт, подібний до створеного класомTk
, за винятком того, що вона не ініціалізує підсистему Tk. Це найчастіше корисно, коли керуєте інтерпретатором Tcl у середовищі, де не потрібно створювати сторонні вікна верхнього рівня або де це неможливо (наприклад, системи Unix/Linux без X-сервера). Для об’єкта, створеного об’єктомTcl()
, можна створити вікно верхнього рівня (та ініціалізувати підсистему Tk), викликавши його методloadtk()
.
Other modules that provide Tk support include:
tkinter.scrolledtext
Текстовий віджет із вбудованою вертикальною смугою прокручування.
tkinter.colorchooser
Діалогове вікно, у якому користувач може вибрати колір.
tkinter.commondialog
Базовий клас для діалогових вікон, визначених в інших модулях, перелічених тут.
tkinter.filedialog
Загальні діалоги, які дозволяють користувачеві вказати файл для відкриття або збереження.
tkinter.font
Утиліти для допомоги в роботі зі шрифтами.
tkinter.messagebox
Доступ до стандартних діалогових вікон Tk.
tkinter.simpledialog
Основні діалоги та функції зручності.
tkinter.dnd
Drag-and-drop support for
tkinter
. This is experimental and should become deprecated when it is replaced with the Tk DND.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
- колір
Colors can be given as the names of X colors in the rgb.txt file, or as strings representing RGB values in 4 bit:
"#RGB"
, 8 bit:"#RRGGBB"
, 12 bit»"#RRRGGGBBB"
, or 16 bit"#RRRRGGGGBBBB"
ranges, where R,G,B here represent any legal hex digit. See page 160 of Ousterhout’s book for details.- курсор
Можна використовувати стандартні імена курсорів 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()
якогось віджета смуги прокрутки, але це може бути будь-який метод віджета, який приймає один аргумент.- wrap:
Має бути одне з:
"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)¶ Скасовує реєстрацію обробника файлів.