Основы Tkinter
Многие программы на сегодняшний день используют графический интерфейс, который более интуитивен и удобен для пользователя, чем консоль. И с помощью языка программирования Python также можно создавать графические программы. Для этого в Python по умолчанию применяется специальный тулкит — набор компонентов, который называется tkinter . Тулкит tkinter доступен в виде отдельного встроенного модуля, который содержит все необходимые графические компоненты — кнопки, текстовые поля и т.д.
По сути Tkinter представляет интерфейс в Python для графической библиотеки Tk (Собственно само название «Tkinter» является сокращением «Tk interface»). Первоначально данная библиотека разрабатывалась для языка Tcl — ее создал в 1988 году Джон Остерхаут (John Ousterhout), профессор computer science из Беркли для создания графических приложений для своего языка Tcl. Но впоследствии Tk была адаптирована для широкого ряда динамических языков, в частности, для Ruby, Perl и естественно для языка Python (в 1994 году). И на сегодняшний день и библиотека Tk, и сам тулкит tkinter доступны для большинства операционных систем, в том числе для Mac OS, Linux и Windows.
- Данный тулкит по умолчанию включен в стандартную библиотеку языка Python в виде отдельного модуля, поэтому не потребуется что-то дополнительно устанавливать
- Tkinter — кроссплатформенный, один и тот же код будет работать одинаково на разных платформах (Mac OS, Linux и Windows)
- Tkinter легко изучать. Сам тулкит, хотя и содержит некоторый готовый код, виджеты и графические элементы, но при этом довольно лаконичен и прост.
- Tk распространяется по BSD-лицензии, поэтому библиотека может быть использована как в опенсорсных проектах, так и в коммерческих наработках.
Если необходимо или интересно узнать версию библиотеки Tk, которая будет использоваться, в интерпертаторе Python можно выполнить следующую инструкцию:
tkinter.Tcl().eval("info patchlevel")
C:\Users\eugen>python Python 3.10.1 (tags/v3.10.1:2cd268a, Dec 6 2021, 19:10:37) [MSC v.1929 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import tkinter >>> >>> tkinter.Tcl().eval("info patchlevel") '8.6.12' >>>
В некоторых ОС на базе Linux иногда при установке python не устанавливается пакет tkinter. В этом случае мы можем доустановить thinkter командой
sudo apt-get install python3-tk
Первая программа
Создадим первую программу с использованием Tkinter. Для этого определим следующий скрипт:
from tkinter import * root = Tk() # создаем корневой объект - окно root.title("Приложение на Tkinter") # устанавливаем заголовок окна root.geometry("300x250") # устанавливаем размеры окна label = Label(text="Hello METANIT.COM") # создаем текстовую метку label.pack() # размещаем метку в окне root.mainloop()
Для создания графического окна применяется конструктор Tk() , который определен в модуле tkinter. Создаваемое окно присваивается переменной root, и через эту переменную мы можем управлять атрибутами окна. В частности, с помощью метода title() можно установить заголовок окна.
С помощью метода geometry() — размер окна. Для установки размера в метод geometry() передается строка в формате «Ширина x Высота». Если при создании окна приложения метод geometry() не вызывается, то окно занимает то пространство, которое необходимо для размещения внутреннего содержимого.
Создав окно, мы можем разместить в нем другие графические элементы. Эти элементы еще называются виджетами. В данном случае мы размещаем в окне текстовую метку. Для это создаем объект класса Label , которые хранит некоторый текст. Затем для размещения элемента label в окне вызываем у него метод pack()
Для отображения окна надо вызвать у него метод mainloop() , который запускает цикл обработки событий окна для взаимодействия с пользователем.
В результате при запуске скрипта мы увидим такое пустое окошко:
На скриншоте выше определено окно, создаваемое в ОС Windows, на каждой конкретной системе отдельные визуальные моменты, отрисовка графических компонентов может несколько отличаться.
Работа с Tkinter в Python
Есть несколько способов взаимодействия с программой: через командную строку или через графический интерфейс. GUI – это настольное приложение, которое предоставляет пользовательский интерфейс, помогающий визуально взаимодействовать с компьютером или любым электронным устройством с помощью графических значков. Благодаря этому графический интерфейс расширяет круг пользователей нашего программного обеспечения.
Python предоставляет множество пакетов, таких как Kivy, PythonQt, wxPython, Tkinter и т.д. для создания графических интерфейсов. Среди этих популярных пакетов, поддерживаемых Python для создания приложений с графическим интерфейсом, – это Tkinter.
Tkinter в Python – это стандартная встроенная библиотека графического интерфейса пользователя, которая предоставляет пользователям объектно-ориентированный интерфейс для набора инструментов графического интерфейса пользователя Tk. Модуль Tkinter является наиболее предпочтительным интерфейсом для построения графического интерфейса для программистов из-за его простоты использования.
Программисты могут быстро создавать приложения с графическим интерфейсом, используя Tkinter. В этом руководстве мы будем использовать Tkinter для создания приложений с графическим интерфейсом.
Создание образца окна
Мы только что обсудили, что при использовании графического интерфейса пользователь взаимодействует с элементами интерфейса, которые называются «виджетами». Такие виджеты, как кнопки и флажки, позволяют пользователю взаимодействовать с программой. Другие виджеты, такие как окна и фреймы, используются в качестве контейнеров для размещения других виджетов. Tkinter легко доступен при стандартной установке Python 3+. Таким образом, пользователю не нужно беспокоиться об установке модуля. Пользователю нужно просто импортировать модуль, используя import tkinter.
Используя Tkinter, создать образец окна очень просто, независимо от используемой вами операционной системы. Мы можем быстро создать окно с помощью следующих строк кода.
import tkinter root_window = tkinter.Tk() root_window.mainloop()
После первого шага импорта пакета Tkinter следующим шагом будет создание виджета корневого окна для любого приложения. В интерфейсе должен быть только один виджет главного окна. Все остальные виджеты будут иметь более низкую иерархию, чем корневой. Следовательно, виджет главного корневого окна должен быть создан до создания других виджетов.
Как вы видите в приведенном выше коде, мы инициализируем корневой цикл `mainloop`. Это вызывает функцию mainloop(), которая вызывает бесконечный цикл главного корневого окна. Это окно будет ожидать любого взаимодействия с пользователем, пока не будет вызван их метод quit(), или в случае, если пользователь закроет окно. Приведенный выше код создает образец виджета Window следующим образом:
Создание виджета метки
Теперь мы научились создавать виджет Windows. Затем давайте добавим простой виджет Label, который отображает образец текста в главном корневом окне. В приведенном ниже примере создается простой виджет метки. Мы можем создать ее, используя класс метки следующим образом:
label_widget = tkinter.Label (root_window, text = «Создайте свой собственный графический интерфейс с помощью Tkinter»)
Класс метки принимает 2 обязательных аргумента, а именно желаемый родительский виджет метки (т.е. root_window) и текст, который будет отображаться меткой. Затем мы можем установить положение метки с помощью функции сетки следующим образом:
import tkinter root_window = tkinter.Tk() label_widget = tkinter.Label(root_window, text="Build your own GUI with Tkinter") label_widget.grid(column=1, row=1)) root_window.mainloop()
Ниже приведен пример вывода, в котором отображается окно с только что созданной меткой.
Настройка виджета метки
Мы можем настроить размер шрифта метки, изменив стиль шрифта, как показано ниже:
label_widget = tkinter.Label (root_window, text = «Создайте свой собственный графический интерфейс с помощью Tkinter», font = («Arial Italic», 40))
Как видите, мы можем использовать параметр font для изменения размера шрифта виджетов.
Настройка заголовка и размера окна
Как видно из приведенного выше примера, размер окна очень мал. Мы можем установить размер по умолчанию, используя функцию геометрии, которая принимает ширину и высоту окна в качестве параметров (в пикселях).
Вышеупомянутая строка кода изменяет размер окна до указанных выше параметров.
Точно так же мы можем добавить заголовок к виджету окна, используя функцию заголовка. Например:
root_window.title («Tkinter tutorial»).
Давайте настроим размер и заголовок окна, добавив указанные выше 2 строки кода в наше существующее приложение.
Мы создали минимальный графический интерфейс с окном и виджетом метки с помощью Tkinter в мгновение ока.
Tkinter: кратко для начинающих
Python — один из самых лёгких и популярных языков программирования. С помощью python решается достаточно много проблем — он сможет помочь в почти любой ситуации. Сегодня речь пойдёт о встроенной библиотеке tkinter. С помощью tkinter создаётся уникальный графический интерфейс для приложения на python.
- Загрузка
- Синтаксис
- Компиляция
Tkinter вы можете скачать на официальном сайте или PyPi.
Загрузка
Для начала работы необходимо загрузить tkinter. Как я уже упоминал выше, он встроенный. Но встроен он начиная с версии Python3.
Загрузка для windows:
pip install tkinter pip install --update tkinter
либо на всё том же PyPi выбираете tkinter для Windows, macOS или Linux.
Синтаксис
Теперь надо разобраться с синтаксисом tkinter. Сначала импортируем:
from tkinter import *
Теперь наша задача — сделать окно приложения. Для этого выберем название приложения (у меня это My App). Запишем
from tkinter import * #исходный код if __name__ == '__main__': #выполнение кода до загрузки root = Tk() root.title('My App') #заголовок root.mainloop() #отображение окна
пояснение
Сначала мы импортировали tkinter. После него идёт исходный код — виджеты, текст и тд. После if name == ‘main’ в отступах идёт код, который выполняется до загрузки, тоесть первее чем код в начале (не считая импорт). Сам код, который будет дальше, пишите до. .mainloop() отвечает за отображение окна — оно обязательно должно быть в конце кода. Если вы редактируете 2 окна, нужно ставить не в конец, а в начало кода второго окна (да я «очень хорошо» объясняю)
виджеты и текст
Теперь наша задача — ввести текст. Наше окно пока что пустое. Выглядит оно так:
Чтобы добавить и редактировать текст, нужно использовать виджет Label. Давайте попробуем записать
lbl1 = Label(root, text='Привет') lbl1.grid(column=0, row=0)
Row отвечает за строку, а column за столбец. Правда, у некоторых могут возникнуть проблемы в том, что вторая строка сдвинута. Для этого изменим grid на place
lbl1.place(x=10,y=10)
Нужно всего лишь указать место по x и y. Для удобства можете задать отдельный класс для управления переменными
class wid_prm(): #класс управления переменными x = 10 y1 = 10 y2 = 30 y3 = 50 x_y_z = 410 #. lbl1 = Label(root, text='. ') lbl2 = Label(root, text='. ') #плейсы lbl1.place(x=x,y=y1) lbl2.place(x=x,y=y2)
Думаю, тут всё понятно. Местоположение по x нужно использовать одно, если вы хотите использовать один столбец. Думаю, не стоит тратить время, нужно автоматизировать управление переменными x, y
for auto_prm in range(5): y1 = 10 y1 += 20 y1 -= 10 y1 -= 10 if y1 == 30: #останавливаем процесс y1 = 30 else: y2 = y1 + 20 y3 = y1 + 40 y4 = y1 + 60 y5,y6,y7,y8 = y1 * 2 + (y1 * 4) y990 = 4 if y990 > 1: x = 10 else: x = 5
А для чего это? Это для того, чтобы задать переменные автоматически. Просто скопируйте и вставьте эту часть кода в свой код.
Давайте теперь сделаем шрифт жирным в Label
lbl1 = Label(root,text='. ',font=("Times New Roman",21,"bold"))
Вы, наверное, уже поняли, что за шрифт отвечает функция font. «bold» можете убрать, если вы не хотите жирный шрифт текста. 21 — размер текста в пикселях/мм.
Теперь попробуем использовать виджет Button — добавим кнопку
btn1 = Button(root, text='Не нажимай', command=clicked) btn1.place(x=x_x,y=y1_y) def clicked(): print('Я же сказал. ')
При нажатии на кнопку будет писать определённый текст по команде clicked. Вы можете дать любое название и любое содержимое команды.
Получается, что полный код пока-что выглядит так:
from tkinter import * #импорт #исходный код class wid_prm(): #класс управления переменными x = 10 y1 = 10 y2 = 30 y3 = 50 x_y_z = 410 for auto_prm in range(5): y1 = 10 y1 += 20 y1 -= 10 y1 -= 10 if y1 == 30: #останавливаем процесс y1 = 30 else: y2 = y1 + 20 y3 = y1 + 40 y4 = y1 + 60 y5,y6,y7,y8 = y1 * 2 + (y1 * 4) y990 = 4 if y990 > 1: x = 10 else: x = 5 class prm_x_y(): x_x = 10 y1_y = 50 lbl1 = Label(root, text='. ') btn1 = Label(root, text='Не нажимай', command=clicked) def clicked(): print('Я же сказал. ') #плейсы lbl1.place(x=x,y=y1) btn1.place(x=x_x,y=y1_y) if __name__ == '__main__': root = Tk() root.title('My App') root.geometry('400x400') root.mainloop()
Виджет messagebox
Виджет messagebox позволяет создать отдельное окно с информацией. Давайте попробуем
from tkinter import * from tkinter import messagebox messagebox.showinfo('Заголовок', 'текст')
Это довольно круто для дополнительных виджетов.
Я, наверное, с синтаксисом закончу.
Компиляция
Первым делом нужно установить приложение auto-py-to-exe. Вы его можете установить либо с того же PyPi, либо через командную строку:
pip install auto-py-to-exe pip install --update auto-py-to-exe
Вы скачаете приложение auto-py-to-exe от python. Вот как оно выглядит:
В script location указываете путь к файлу. Вот небольшой пример:
>Path to file: >\Users\username\Desktop\file.py
Дальше всё просто. Укажите One File, если не хотите, чтобы файлы приложения засоряли ваш пк. Если хотите скрыть консоль (и оставить только окно tkinter), выберите Window Based.
Загрузите иконку приложения в Icon. И наконец-то нажимаете CONVERT .PY TO .EXE. Думаю, с последующим вы сами справитесь — в консоль будет выводиться всякая всячина, и в итоге вы успешно сконвертируете приложение на tkinter.
В этом посте я рассказал базу синтаксиса tkinter. Да, виджетов в ткинтере в разы больше, я могу их подробно расписать в следующей статье если вы захотите.
как установить tkinter?
в python3 я использую библиотеку matplotlib, при помощи неё рисую график, в результате создаётся файл, я его открываю и смотрю без проблем. но я хотел бы чтобы этот график выводился на экране сразу. для этого нужно подключить tkinter
я делаю следующее:
(transaction1) md@md ~/.MINT18/code/python/transaction1 $ sudo apt-get install python-tk Чтение списков пакетов… Готово Построение дерева зависимостей Чтение информации о состоянии… Готово Предлагаемые пакеты: tix python-tk-dbg Следующие НОВЫЕ пакеты будут установлены: python-tk Обновлено 0 пакетов, установлено 1 новых пакетов, для удаления отмечено 0 пакетов, и 13 пакетов не обновлено. Необходимо скачать 26,3 kB архивов. После данной операции объём занятого дискового пространства возрастёт на 95,2 kB. Пол:1 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 python-tk amd64 2.7.12-1~16.04 [26,3 kB] Получено 26,3 kB за 0с (84,0 kB/s) Выбор ранее не выбранного пакета python-tk. (Чтение базы данных … на данный момент установлено 218287 файлов и каталогов.) Подготовка к распаковке …/python-tk_2.7.12-1~16.04_amd64.deb … Распаковывается python-tk (2.7.12-1~16.04) … Настраивается пакет python-tk (2.7.12-1~16.04) … (transaction1) md@md ~/.MINT18/code/python/transaction1 $ sudo apt-get install python-tk Чтение списков пакетов… Готово Построение дерева зависимостей Чтение информации о состоянии… Готово Уже установлен пакет python-tk самой новой версии (2.7.12-1~16.04). Обновлено 0 пакетов, установлено 0 новых пакетов, для удаления отмечено 0 пакетов, и 13 пакетов не обновлено. (transaction1) md@md ~/.MINT18/code/python/transaction1 $ whereis python-tk python-tk: (transaction1) md@md ~/.MINT18/code/python/transaction1 $ which python-tk
судя по всему tkinter установился. теперь я пробую импортировать его в скрипт так:
import tkinter
но после запуска скрипта получаю следующую ошибку:
(transaction1) md@md ~/.MINT18/code/python/transaction1 $ python index3.py Traceback (most recent call last): File "index3.py", line 3, in import tkinter ModuleNotFoundError: No module named 'tkinter'
ещё я пробовал делать так:
(transaction1) md@md ~/.MINT18/code/python/transaction1 $ pipenv install tkinter Installing tkinter… Adding tkinter to Pipfile's [packages]… ✔ Installation Succeeded Pipfile.lock (a21357) out of date, updating to (757436)… Locking [dev-packages] dependencies… Locking [packages] dependencies… ✘ Locking Failed! [pipenv.exceptions.ResolutionFailure]: File "/home/md/.local/lib/python3.5/site-packages/pipenv/resolver.py", line 61, in resolve [pipenv.exceptions.ResolutionFailure]: return resolve_deps( [pipenv.exceptions.ResolutionFailure]: File "/home/md/.local/lib/python3.5/site-packages/pipenv/utils.py", line 718, in resolve_deps [pipenv.exceptions.ResolutionFailure]: resolved_tree, hashes, markers_lookup, resolver = actually_resolve_deps( [pipenv.exceptions.ResolutionFailure]: File "/home/md/.local/lib/python3.5/site-packages/pipenv/utils.py", line 480, in actually_resolve_deps [pipenv.exceptions.ResolutionFailure]: resolved_tree = resolver.resolve() [pipenv.exceptions.ResolutionFailure]: File "/home/md/.local/lib/python3.5/site-packages/pipenv/utils.py", line 395, in resolve [pipenv.exceptions.ResolutionFailure]: raise ResolutionFailure(message=str(e)) [pipenv.exceptions.ResolutionFailure]: pipenv.exceptions.ResolutionFailure: ERROR: ERROR: Could not find a version that matches threading [pipenv.exceptions.ResolutionFailure]: No versions found [pipenv.exceptions.ResolutionFailure]: Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies. First try clearing your dependency cache with $ pipenv lock --clear, then try the original command again. Alternatively, you can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation. Hint: try $ pipenv lock --pre if it is a pre-release dependency. ERROR: ERROR: Could not find a version that matches threading No versions found Was https://pypi.org/simple reachable? [pipenv.exceptions.ResolutionFailure]: return resolve_deps( [pipenv.exceptions.ResolutionFailure]: File "/home/md/.local/lib/python3.5/site-packages/pipenv/utils.py", line 718, in resolve_deps [pipenv.exceptions.ResolutionFailure]: resolved_tree, hashes, markers_lookup, resolver = actually_resolve_deps( [pipenv.exceptions.ResolutionFailure]: File "/home/md/.local/lib/python3.5/site-packages/pipenv/utils.py", line 480, in actually_resolve_deps [pipenv.exceptions.ResolutionFailure]: resolved_tree = resolver.resolve() [pipenv.exceptions.ResolutionFailure]: File "/home/md/.local/lib/python3.5/site-packages/pipenv/utils.py", line 395, in resolve [pipenv.exceptions.ResolutionFailure]: raise ResolutionFailure(message=str(e)) [pipenv.exceptions.ResolutionFailure]: pipenv.exceptions.ResolutionFailure: ERROR: ERROR: Could not find a version that matches threading [pipenv.exceptions.ResolutionFailure]: No versions found [pipenv.exceptions.ResolutionFailure]: Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies. First try clearing your dependency cache with $ pipenv lock --clear, then try the original command again. Alternatively, you can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation. Hint: try $ pipenv lock --pre if it is a pre-release dependency. ERROR: ERROR: Could not find a version that matches threading No versions found Was https://pypi.org/simple reachable? (transaction1) md@md ~/.MINT18/code/python/transaction1 $ pipenv graph matplotlib==3.1.2 - cycler [required: >=0.10, installed: 0.10.0] - six [required: Any, installed: 1.13.0] - kiwisolver [required: >=1.0.1, installed: 1.1.0] - setuptools [required: Any, installed: 42.0.2] - numpy [required: >=1.11, installed: 1.17.4] - pyparsing [required: >=2.0.1,!=2.1.6,!=2.1.2,!=2.0.4, installed: 2.4.5] - python-dateutil [required: >=2.1, installed: 2.8.1] - six [required: >=1.5, installed: 1.13.0] pandas==0.25.3 - numpy [required: >=1.13.3, installed: 1.17.4] - python-dateutil [required: >=2.6.1, installed: 2.8.1] - six [required: >=1.5, installed: 1.13.0] - pytz [required: >=2017.2, installed: 2019.3] psycopg2==2.8.4 redis==3.3.11