Как использовать tkinter python
Перейти к содержимому

Как использовать tkinter python

  • автор:

Основы 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() , который запускает цикл обработки событий окна для взаимодействия с пользователем.

В результате при запуске скрипта мы увидим такое пустое окошко:

Графическая программа на Tkinter и Python

На скриншоте выше определено окно, создаваемое в ОС Windows, на каждой конкретной системе отдельные визуальные моменты, отрисовка графических компонентов может несколько отличаться.

Что такое Tkinter

Tkinter – это пакет для Python, предназначенный для работы с библиотекой Tk. Библиотека Tk содержит компоненты графического интерфейса пользователя (graphical user interface – GUI). Эта библиотека написана на языке программирования Tcl.

Под графическим интерфейсом пользователя (GUI) подразумеваются все те окна, кнопки, текстовые поля для ввода, скроллеры, списки, радиокнопки, флажки и другие элементы, которые вы видите на экране, открывая то или иное приложение. Через них вы взаимодействуете с программой и управляете ею. Все эти элементы интерфейса будем называть виджетами (widgets – штуковины).

В настоящее время почти все приложения, которые создаются для конечного пользователя, имеют GUI. Редкие программы, подразумевающие взаимодействие с человеком, остаются консольными. В предыдущих двух курсах мы писали только консольные программы.

Существует множество библиотек GUI, среди которых Tk не самый популярный инструмент, хотя с его помощью написано немало проектов. Он был выбран для Python по-умолчанию. Установочный файл интерпретатора Питона обычно уже включает пакет tkinter в составе стандартной библиотеки.

Tkinter можно представить как переводчик с языка Python на язык Tcl. Вы пишете программу на Python, а код модуля tkinter переводит ваши инструкции на язык Tcl, который понимает библиотека Tk.

Программы с графическим интерфейсом пользователя событийно-ориентированные. Вы уже должны иметь представление о структурном и желательно объектно-ориентированном программировании. Событийно-ориентированное ориентировано на события. То есть та или иная часть программного кода начинает выполняться лишь тогда, когда случается то или иное событие.

Событийно-ориентированное программирование базируется на объектно-ориентированном. Даже если мы не будем разрабатывать собственные классы, мы обязательно будем пользоваться теми, что есть в tkinter . Все виджеты – это объекты-экземпляры, создаваемые от встроенных классов.

События бывают разными. Сработал временной фактор, завершилась загрузка, пришло сообщение, кто-то кликнул мышкой или нажал Enter , начал вводить текст, переключил радиокнопки, прокрутил страницу вниз и так далее. Когда случается что-либо подобное, то, если был создан обработчик для соответствующего события, происходит выполнение определенной части программы, что приводит к какому-либо результату.

Tkinter импортируется стандартно для модуля Python любым из способов:

  • import tkinter
  • from tkinter import *
  • import tkinter as tk

Можно импортировать отдельные классы, что делается редко. В данном курсе мы будем использовать выражение from tkinter import * .

Если необходимо, узнать установленную версию Tk можно через константу TkVersion:

>>> from tkinter import * >>> TkVersion 8.6

Чтобы написать GUI-программу, надо выполнить приблизительно следующее:

  1. Создать главное окно.
  2. Создать виджеты и выполнить конфигурацию их свойств (опций).
  3. Определить события, то есть то, на что будет реагировать программа.
  4. Описать обработчики событий, то есть то, как будет реагировать программа.
  5. Расположить виджеты в главном окне.
  6. Запустить цикл обработки событий.

Последовательность не обязательно такая, но первый и последний пункты всегда остаются на своих местах. Посмотрим все это в действии.

В современных операционных системах любое пользовательское приложение заключено в окно, которое можно назвать главным, так как в нем располагаются все остальные виджеты. Объект окна верхнего уровня создается от класса Tk модуля tkinter . Переменную, связываемую с объектом, часто называют root (корень):

root = Tk()

Пусть в окне приложения располагаются текстовое поле, метка и кнопка. Данные объекты создаются от классов Entry , Label и Button модуля tkinter . Сразу выполним конфигурацию некоторые их свойства с помощью передачи аргументов конструкторам этих классов:

ent = Entry(root, width=20) but = Button(root, text="Преобразовать") lab = Label(root, width=20, bg='black', fg='white')

Устанавливать свойства объектов не обязательно при их создании. Существуют еще пара способов, с помощью которых это можно сделать после.

Первым аргументом в конструктор виджета передается виджет-хозяин, то есть тот, на котором будет располагаться создаваемый. В случае, когда элементы GUI помещаются непосредственно на главное окно, родителя можно не указывать. То есть в нашем примере мы можем убрать root :

ent = Entry(width=20) but = Button(text="Преобразовать") lab = Label(width=20, bg='black', fg='white')

Однако виджеты не обязательно располагаются на root ‘е. Они могут находиться на других виджетах, и тогда указывать «мастера» необходимо.

Пусть в программе текст, введенный человеком в поле, при нажатии на кнопку разбивается на список слов, слова сортируются по алфавиту и выводятся в метке. Выполняющий все это код надо поместить в функцию:

def str_to_sort_list(event): s = ent.get() s = s.split() s.sort() lab['text'] = ' '.join(s)

У функций, которые вызываются при наступлении события с помощью метода bind , должен быть один параметр. Обычно его называют event , то есть «событие».

В нашей функции с помощью метода get из поля забирается текст, представляющий собой строку. Она преобразуется в список слов с помощью метода split . Потом список сортируется. В конце изменяется свойство text метки. Ему присваивается строка, полученная из списка с помощью строкового метода join .

Теперь необходимо связать вызов функции с событием:

but.bind('', str_to_sort_list)

В данном случае это делается с помощью метода bind . Ему передается событие и функция-обработчик. Событие будет передано в функцию и присвоено параметру event . Здесь событием является щелчок левой кнопкой мыши, что обозначается строкой » .

В любом приложении виджеты не разбросаны по окну как попало, а организованы, интерфейс продуман до мелочей и обычно подчинен определенным стандартам. Пока расположим элементы друг под другом с помощью наиболее простого менеджера геометрии tkinter – метода pack :

ent.pack() but.pack() lab.pack()

Метод mainloop экземпляра Tk запускает главный цикл обработки событий, что в том числе приводит к отображению главного окна со всеми «упакованными» на нем виджетами:

root.mainloop()

Полный код программы:

from tkinter import * def str_to_sort_list(event): s = ent.get() s = s.split() s.sort() lab['text'] = ' '.join(s) root = Tk() ent = Entry(width=20) but = Button(text="Преобразовать") lab = Label(width=20, bg='black', fg='white') but.bind('', str_to_sort_list) ent.pack() but.pack() lab.pack() root.mainloop() 

В результате выполнения данного скрипта появляется окно, в текстовое поле которого можно ввести список слов, нажать кнопку и получить его отсортированный вариант:

Пример программы на Python, написанной с помощью tkinter

Попробуем теперь реализовать в нашей программе объектно-ориентированный подход. Это необязательно, но позволяет связать/объединить вместе (вспомните про инкапсуляцию в ООП) виджет и функции, которые обрабатывают связанные с ним события, что концептуально более верно. В этом случае функции становятся методами.

Пусть группа из метки, кнопки и поля представляет собой один объект, порождаемый от класса Block . Тогда в основной ветке программы будет главное окно, объект типа Block и запуск окна. Поскольку блок должен быть привязан к главному окну, то неплохо бы передать в конструктор класса окно-родитель:

from tkinter import * root = Tk() first_block = Block(root) root.mainloop()

Теперь напишем сам класс Block :

class Block: def __init__(self, master): self.ent = Entry(master, width=20) self.but = Button(master, text="Преобразовать") self.lab = Label(master, width=20, bg='black', fg='white') self.but['command'] = self.str_to_sort self.ent.pack() self.but.pack() self.lab.pack() def str_to_sort(self): s = self.ent.get().split() s.sort() self.lab['text'] = ' '.join(s)

Здесь виджеты являются значениями полей объекта типа Block , функция-обработчик события нажатия на кнопку устанавливается не с помощью метода bind , а с помощью свойства кнопки command . В этом случае в вызываемой функции не требуется параметр event . В метод мы передаем только сам объект.

Больший смысл в определении собственного класса появляется, когда требуется несколько или множество похожих объектов-блоков. Допустим, нам нужно несколько блоков, состоящих из метки, кнопки, поля. Причем у кнопки каждой группы будет своя функция-обработчик клика.

Тогда можно передавать значения для свойства command в конструктор. Значение будет представлять собой привязываемую к кнопке функцию-обработчик события. Полный код программы:

from tkinter import * class Block: def __init__(self, master, func): self.ent = Entry(master, width=20) self.but = Button(master, text="Преобразовать") self.lab = Label(master, width=20, bg='black', fg='white') # self.but['command'] = eval('self.' + func) self.but['command'] = getattr(self, func) self.ent.pack() self.but.pack() self.lab.pack() def str_to_sort(self): s = self.ent.get().split() s.sort() self.lab['text'] = ' '.join(s) def str_reverse(self): s = self.ent.get().split() s.reverse() self.lab['text'] = ' '.join(s) root = Tk() first_block = Block(root, 'str_to_sort') second_block = Block(root, 'str_reverse') root.mainloop() 

Выражение getattr(self, func) , где вместо func подставляется строка ‘str_to_sort’ или ‘str_reverse’, преобразуется в выражение self.str_to_sort или self.str_reverse .

При выполнения этого кода в окне будут выведены два однотипных блока, кнопки которых выполняют разные действия.

Окно с двумя блоками кнопки, метки и текстового поля

Класс можно сделать более гибким, если жестко не задавать свойства виджетов, а передавать значения как аргументы в конструктор, после чего присваивать их соответствующим опциям при создании объектов.

Практическая работа

Напишите простейший калькулятор, состоящий из двух текстовых полей, куда пользователь вводит числа, и четырех кнопок «+», «-«, «*», «/». Результат вычисления должен отображаться в метке. Если арифметическое действие выполнить невозможно (например, если были введены буквы, а не числа), то в метке должно появляться слово «ошибка».

Курс с примерами решений практических работ: pdf-версия

X Скрыть Наверх

Tkinter. Программирование GUI на Python

Tkinter: кратко для начинающих

Python — один из самых лёгких и популярных языков программирования. С помощью python решается достаточно много проблем — он сможет помочь в почти любой ситуации. Сегодня речь пойдёт о встроенной библиотеке tkinter. С помощью tkinter создаётся уникальный графический интерфейс для приложения на python.

  1. Загрузка
  2. Синтаксис
  3. Компиляция

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 окна, нужно ставить не в конец, а в начало кода второго окна (да я «очень хорошо» объясняю)

виджеты и текст

Теперь наша задача — ввести текст. Наше окно пока что пустое. Выглядит оно так:

P.S. картинка с интернета

Чтобы добавить и редактировать текст, нужно использовать виджет Label. Давайте попробуем записать

lbl1 = Label(root, text='Привет') lbl1.grid(column=0, row=0)

Виджет Label

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. Вот как оно выглядит:

auto-py-to-exe

В script location указываете путь к файлу. Вот небольшой пример:

>Path to file: >\Users\username\Desktop\file.py

Дальше всё просто. Укажите One File, если не хотите, чтобы файлы приложения засоряли ваш пк. Если хотите скрыть консоль (и оставить только окно tkinter), выберите Window Based.

Загрузите иконку приложения в Icon. И наконец-то нажимаете CONVERT .PY TO .EXE. Думаю, с последующим вы сами справитесь — в консоль будет выводиться всякая всячина, и в итоге вы успешно сконвертируете приложение на tkinter.

В этом посте я рассказал базу синтаксиса tkinter. Да, виджетов в ткинтере в разы больше, я могу их подробно расписать в следующей статье если вы захотите.

Обучение Python GUI (уроки по Tkinter)

В этом уроке мы узнаем, как разрабатывать графические пользовательские интерфейсы, с помощью разбора некоторых примеров графического интерфейса Python с использованием библиотеки Tkinter.

Библиотека Tkinter установлена в Python в качестве стандартного модуля, поэтому нам не нужно устанавливать что-либо для его использования. Tkinter — очень мощная библиотека. Если вы уже установили Python, можете использовать IDLE, который является интегрированной IDE, поставляемой в Python, эта IDE написана с использованием Tkinter. Звучит круто!

Мы будем использовать Python 3.7 поэтому, если вы все еще используете Python 2.x, настоятельно рекомендуем перейти на Python 3.x, если вы не в курсе нюансов изменения языка, с целью, чтобы вы могли настроить код для запуска без ошибок.

Давайте предположим, что у вас уже есть базовые знания по Python, которые помогут понять что мы будем делать.
Мы начнем с создания окна, в котором мы узнаем, как добавлять виджеты, такие, как кнопки, комбинированные поля и т. д. После этого поэкспериментируем со своими свойствами, поэтому предлагаю начать.

Создание своего первого графического интерфейса

Для начала, следует импортировать Tkinter и создать окно, в котором мы зададим его название:

from tkinter import * window = Tk() window.title("Добро пожаловать в приложение PythonRu") window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

Результат будет выглядеть следующим образом:
Прекрасно! Наше приложение работает.
Последняя строка вызывает функцию mainloop . Эта функция вызывает бесконечный цикл окна, поэтому окно будет ждать любого взаимодействия с пользователем, пока не будет закрыто.

В случае, если вы забудете вызвать функцию mainloop , для пользователя ничего не отобразится.

Создание виджета Label

Чтобы добавить текст в наш предыдущий пример, мы создадим lbl , с помощью класса Label , например:

lbl = Label(window, text="Привет") 

Затем мы установим позицию в окне с помощью функции grid и укажем ее следующим образом:

lbl.grid(column=0, row=0) 

Полный код, будет выглядеть следующим образом:

from tkinter import * window = Tk() window.title("Добро пожаловать в приложение PythonRu") lbl = Label(window, text="Привет") lbl.grid(column=0, row=0) window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

И вот как будет выглядеть результат:
Если функция grid не будет вызвана, текст не будет отображаться.

Настройка размера и шрифта текста

Вы можете задать шрифт текста и размер. Также можно изменить стиль шрифта. Для этого передайте параметр font таким образом:

lbl = Label(window, text="Привет", font=("Arial Bold", 50)) 

Обучение Python GUI (уроки по Tkinter)

Обратите внимание, что параметр font может быть передан любому виджету, для того, чтобы поменять его шрифт, он применяется не только к Label .

Отлично, но стандартное окно слишком мало. Как насчет настройки размера окна?

Настройка размеров окна приложения

Мы можем установить размер окна по умолчанию, используя функцию geometry следующим образом:

window.geometry('400x250') 

В приведенной выше строке устанавливается окно шириной до 400 пикселей и высотой до 250 пикселей.

Попробуем добавить больше виджетов GUI, например, кнопки и посмотреть, как обрабатывается нажатие кнопок.

Добавление виджета Button

Начнем с добавления кнопки в окно. Кнопка создается и добавляется в окно так же, как и метка:

btn = Button(window, text="Не нажимать!") btn.grid(column=1, row=0) 

Наш код будет выглядеть вот так:

from tkinter import * window = Tk() window.title("Добро пожаловать в приложение PythonRu") window.geometry('400x250') lbl = Label(window, text="Привет", font=("Arial Bold", 50)) lbl.grid(column=0, row=0) btn = Button(window, text="Не нажимать!") btn.grid(column=1, row=0) window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

Результат будет следующим:
Обратите внимание, что мы помещаем кнопку во второй столбец окна, что равно 1. Если вы забудете и поместите кнопку в том же столбце, который равен 0, он покажет только кнопку.

Изменение цвета текста и фона у Button

Вы можете поменять цвет текста кнопки или любого другого виджета, используя свойство fg .
Кроме того, вы можете поменять цвет фона любого виджета, используя свойство bg .

btn = Button(window, text="Не нажимать!", bg="black", fg="red") 

Обучение Python GUI (уроки по Tkinter)

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

Кнопка Click

Для начала, мы запишем функцию, которую нужно выполнить при нажатии кнопки:

def clicked(): lbl.configure(text="Я же просил. ") 

Затем мы подключим ее с помощью кнопки, указав следующую ​​функцию:

btn = Button(window, text="Не нажимать!", command=clicked) 

Обратите внимание: мы пишем clicked , а не clicked() с круглыми скобками. Теперь полный код будет выглядеть так:

from tkinter import * def clicked(): lbl.configure(text="Я же просил. ") window = Tk() window.title("Добро пожаловать в приложение PythonRu") window.geometry('400x250') lbl = Label(window, text="Привет", font=("Arial Bold", 50)) lbl.grid(column=0, row=0) btn = Button(window, text="Не нажимать!", command=clicked) btn.grid(column=1, row=0) window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

При нажатии на кнопку, результат, как и ожидалось, будет выглядеть следующим образом:
Круто!

Получение ввода с использованием класса Entry (текстовое поле Tkinter)

В предыдущих примерах GUI Python мы ознакомились со способами добавления простых виджетов, а теперь попробуем получить пользовательский ввод, используя класс Tkinter Entry (текстовое поле Tkinter).
Вы можете создать текстовое поле с помощью класса Tkinter Entry следующим образом:

txt = Entry(window, width=10) 

Затем вы можете добавить его в окно, используя функцию grid .
Наше окно будет выглядеть так:

from tkinter import * def clicked(): lbl.configure(text="Я же просил. ") window = Tk() window.title("Добро пожаловать в приложение PythonRu") window.geometry('400x250') lbl = Label(window, text="Привет") lbl.grid(column=0, row=0) txt = Entry(window,width=10) txt.grid(column=1, row=0) btn = Button(window, text="Не нажимать!", command=clicked) btn.grid(column=2, row=0) window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

Полученный результат будет выглядеть так:
Теперь, если вы нажмете кнопку, она покажет то же самое старое сообщение, но что же будет с отображением введенного текста в виджет Entry ?

Во-первых, вы можете получить текст ввода, используя функцию get . Мы можем записать код для выбранной функции таким образом:

def clicked(): res = "Привет <>".format(txt.get()) lbl.configure(text=res) 

Если вы нажмете на кнопку — появится текст «Привет » вместе с введенным текстом в виджете записи. Вот полный код:

from tkinter import * def clicked(): res = "Привет <>".format(txt.get()) lbl.configure(text=res) window = Tk() window.title("Добро пожаловать в приложение PythonRu") window.geometry('400x250') lbl = Label(window, text="Привет") lbl.grid(column=0, row=0) txt = Entry(window,width=10) txt.grid(column=1, row=0) btn = Button(window, text="Клик!", command=clicked) btn.grid(column=2, row=0) window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

Запустите вышеуказанный код и проверьте результат:
Прекрасно!

Каждый раз, когда мы запускаем код, нам нужно нажать на виджет ввода, чтобы настроить фокус на ввод текста, но как насчет автоматической настройки фокуса?

Установка фокуса виджета ввода

Здесь все очень просто, ведь все, что нам нужно сделать, — это вызвать функцию focus :

txt.focus() 

Когда вы запустите свой код, вы заметите, что виджет ввода в фокусе, который дает возможность сразу написать текст.

Отключить виджет ввода

Чтобы отключить виджет ввода, отключите свойство состояния:

txt = Entry(window,width=10, state='disabled') 

Обучение Python GUI (уроки по Tkinter)

Теперь вы не сможете ввести какой-либо текст.

Добавление виджета Combobox

Чтобы добавить виджет поля с выпадающем списком, используйте класс Combobox из ttk следующим образом:

from tkinter.ttk import Combobox combo = Combobox(window) 

Затем добавьте свои значения в поле со списком.

from tkinter import * from tkinter.ttk import Combobox window = Tk() window.title("Добро пожаловать в приложение PythonRu") window.geometry('400x250') combo = Combobox(window) combo['values'] = (1, 2, 3, 4, 5, "Текст") combo.current(1) # установите вариант по умолчанию combo.grid(column=0, row=0) window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

Как видите с примера, мы добавляем элементы combobox , используя значения tuple .
Чтобы установить выбранный элемент, вы можете передать индекс нужного элемента текущей функции.
Чтобы получить элемент select , вы можете использовать функцию get вот таким образом:

combo.get() 

Добавление виджета Checkbutton (чекбокса)

С целью создания виджета checkbutton , используйте класс Checkbutton :

from tkinter.ttk import Checkbutton chk = Checkbutton(window, text='Выбрать') 

Кроме того, вы можете задать значение по умолчанию, передав его в параметр var в Checkbutton :

from tkinter import * from tkinter.ttk import Checkbutton window = Tk() window.title("Добро пожаловать в приложение PythonRu") window.geometry('400x250') chk_state = BooleanVar() chk_state.set(True) # задайте проверку состояния чекбокса chk = Checkbutton(window, text='Выбрать', var=chk_state) chk.grid(column=0, row=0) window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

Посмотрите на результат:

Установка состояния Checkbutton

Здесь мы создаем переменную типа BooleanVar , которая не является стандартной переменной Python, это переменная Tkinter, затем передаем ее классу Checkbutton , чтобы установить состояние чекбокса как True в приведенном выше примере.

Вы можете установить для BooleanVar значение false, что бы чекбокс не был отмечен.
Так же, используйте IntVar вместо BooleanVar и установите значения 0 и 1.

chk_state = IntVar() chk_state.set(0) # False chk_state.set(1) # True 

Эти примеры дают тот же результат, что и BooleanVar .

Добавление виджетов Radio Button

Чтобы добавить radio кнопки, используйте класс RadioButton :

rad1 = Radiobutton(window,text='Первый', value=1) 

Обратите внимание, что вы должны установить value для каждой radio кнопки с уникальным значением, иначе они не будут работать.

from tkinter import * from tkinter.ttk import Radiobutton window = Tk() window.title("Добро пожаловать в приложение PythonRu") window.geometry('400x250') rad1 = Radiobutton(window, text='Первый', value=1) rad2 = Radiobutton(window, text='Второй', value=2) rad3 = Radiobutton(window, text='Третий', value=3) rad1.grid(column=0, row=0) rad2.grid(column=1, row=0) rad3.grid(column=2, row=0) window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

Результатом вышеприведенного кода будет следующий:
Кроме того, вы можете задать command любой из этих кнопок для определенной функции. Если пользователь нажимает на такую кнопку, она запустит код функции.
Вот пример:

rad1 = Radiobutton(window,text='Первая', value=1, command=clicked) def clicked(): # Делайте, что нужно 

Получение значения Radio Button (Избранная Radio Button)

Чтобы получить текущую выбранную radio кнопку или ее значение, вы можете передать параметр переменной и получить его значение.

from tkinter import * from tkinter.ttk import Radiobutton def clicked(): lbl.configure(text=selected.get()) window = Tk() window.title("Добро пожаловать в приложение PythonRu") window.geometry('400x250') selected = IntVar() rad1 = Radiobutton(window,text='Первый', value=1, variable=selected) rad2 = Radiobutton(window,text='Второй', value=2, variable=selected) rad3 = Radiobutton(window,text='Третий', value=3, variable=selected) btn = Button(window, text="Клик", command=clicked) lbl = Label(window) rad1.grid(column=0, row=0) rad2.grid(column=1, row=0) rad3.grid(column=2, row=0) btn.grid(column=3, row=0) lbl.grid(column=0, row=1) window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

Каждый раз, когда вы выбираете radio button, значение переменной будет изменено на значение кнопки.

Добавление виджета ScrolledText (текстовая область Tkinter)

Чтобы добавить виджет ScrolledText , используйте класс ScrolledText :

from tkinter import scrolledtext txt = scrolledtext.ScrolledText(window,width=40,height=10) 

Здесь нужно указать ширину и высоту ScrolledText , иначе он заполнит все окно.

from tkinter import * from tkinter import scrolledtext window = Tk() window.title("Добро пожаловать в приложение PythonRu") window.geometry('400x250') txt = scrolledtext.ScrolledText(window, width=40, height=10) txt.grid(column=0, row=0) window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

Результат:

Настройка содержимого Scrolledtext

Используйте метод insert , чтобы настроить содержимое Scrolledtext :

txt.insert(INSERT, 'Текстовое поле') 

Удаление/Очистка содержимого Scrolledtext

Чтобы очистить содержимое данного виджета, используйте метод delete :

txt.delete(1.0, END) # мы передали координаты очистки 

Создание всплывающего окна с сообщением

Чтобы показать всплывающее окно с помощью Tkinter, используйте messagebox следующим образом:

from tkinter import messagebox messagebox.showinfo('Заголовок', 'Текст') 

Довольно легко! Давайте покажем окно сообщений при нажатии на кнопку пользователем.

from tkinter import * from tkinter import messagebox def clicked(): messagebox.showinfo('Заголовок', 'Текст') window = Tk() window.title("Добро пожаловать в приложение PythonRu") window.geometry('400x250') btn = Button(window, text='Клик', command=clicked) btn.grid(column=0, row=0) window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

Когда вы нажмете на кнопку, появится информационное окно.

Показ сообщений о предупреждениях и ошибках

Вы можете показать предупреждающее сообщение или сообщение об ошибке таким же образом. Единственное, что нужно изменить—это функция сообщения.

messagebox.showwarning('Заголовок', 'Текст') # показывает предупреждающее сообщение messagebox.showerror('Заголовок', 'Текст') # показывает сообщение об ошибке 

Показ диалоговых окон с выбором варианта

Чтобы показать пользователю сообщение “да/нет”, вы можете использовать одну из следующих функций messagebox :

from tkinter import messagebox res = messagebox.askquestion('Заголовок', 'Текст') res = messagebox.askyesno('Заголовок', 'Текст') res = messagebox.askyesnocancel('Заголовок', 'Текст') res = messagebox.askokcancel('Заголовок', 'Текст') res = messagebox.askretrycancel('Заголовок', 'Текст') 

Вы можете выбрать соответствующий стиль сообщения согласно вашим потребностям. Просто замените строку функции showinfo на одну из предыдущих и запустите скрипт. Кроме того, можно проверить, какая кнопка нажата, используя переменную результата.

Если вы кликнете OK, yes или retry, значение станет True, а если выберете no или cancel, значение будет False.
Единственной функцией, которая возвращает одно из трех значений, является функция askyesnocancel ; она возвращает True/False/None.

Добавление SpinBox (Виджет спинбокс)

Для создания виджета спинбокса, используйте класс Spinbox :

spin = Spinbox(window, from_=0, to=100) 

Таким образом, мы создаем виджет Spinbox , и передаем параметры from и to , чтобы указать диапазон номеров.
Кроме того, вы можете указать ширину виджета с помощью параметра width :

spin = Spinbox(window, from_=0, to=100, width=5) 

Проверим пример полностью:

from tkinter import * window = Tk() window.title("Добро пожаловать в приложение PythonRu") window.geometry('400x250') spin = Spinbox(window, from_=0, to=100, width=5) spin.grid(column=0, row=0) window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

Вы можете указать числа для Spinbox , вместо использования всего диапазона следующим образом:

spin = Spinbox(window, values=(3, 8, 11), width=5) 

Виджет покажет только эти 3 числа: 3, 8 и 11.

Задать значение по умолчанию для Spinbox

В случае, если вам нужно задать значение по умолчанию для Spinbox, вы можете передать значение параметру textvariable следующим образом:

var = IntVar() var.set(36) spin = Spinbox(window, from_=0, to=100, width=5, textvariable=var) 

Теперь, если вы запустите программу, она покажет 36 как значение по умолчанию для Spinbox.

Добавление виджета Progressbar

Чтобы создать данный виджет, используйте класс progressbar :

from tkinter.ttk import Progressbar bar = Progressbar(window, length=200) 

Установите значение progressbar таким образом:

bar['value'] = 70 

Вы можете установить это значение на основе любого процесса или при выполнении задачи.

Изменение цвета Progressbar

Изменение цвета Progressbar немного сложно. Сначала нужно создать стиль и задать цвет фона, а затем настроить созданный стиль на Progressbar. Посмотрите следующий пример:

from tkinter import * from tkinter.ttk import Progressbar from tkinter import ttk window = Tk() window.title("Добро пожаловать в приложение PythonRu") window.geometry('400x250') style = ttk.Style() style.theme_use('default') style.configure("black.Horizontal.TProgressbar", background='black') bar = Progressbar(window, length=200, style='black.Horizontal.TProgressbar') bar['value'] = 70 bar.grid(column=0, row=0) window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

И в результате вы получите следующее:

Добавление поля загрузки файла

Для добавления поля с файлом, используйте класс filedialog :

from tkinter import filedialog file = filedialog.askopenfilename() 

После того, как вы выберете файл, нажмите “Открыть”; переменная файла будет содержать этот путь к файлу. Кроме того, вы можете запросить несколько файлов:

files = filedialog.askopenfilenames() 

Указание типа файлов (расширение фильтра файлов)

Возможность указания типа файлов доступна при использовании параметра filetypes , однако при этом важно указать расширение в tuples.

file = filedialog.askopenfilename(filetypes = (("Text files","*.txt"),("all files","*.*"))) 

Вы можете запросить каталог, используя метод askdirectory :

dir = filedialog.askdirectory() 

Вы можете указать начальную директорию для диалогового окна файла, указав initialdir следующим образом:

from os import path file = filedialog.askopenfilename(initialdir= path.dirname(__file__)) 

Добавление панели меню

Для добавления панели меню, используйте класс menu :

from tkinter import Menu menu = Menu(window) menu.add_command(label='Файл') window.config(menu=menu) 

Сначала мы создаем меню, затем добавляем наш первый пункт подменю. Вы можете добавлять пункты меню в любое меню с помощью функции add_cascade() таким образом:

menu.add_cascade(label='Автор', menu=new_item) 

Наш код будет выглядеть так:

from tkinter import * from tkinter import Menu window = Tk() window.title("Добро пожаловать в приложение PythonRu") window.geometry('400x250') menu = Menu(window) new_item = Menu(menu) new_item.add_command(label='Новый') menu.add_cascade(label='Файл', menu=new_item) window.config(menu=menu) window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

Таким образом, вы можете добавить столько пунктов меню, сколько захотите.

from tkinter import * window = Tk() window.title("Добро пожаловать в приложение PythonRu") window.geometry('400x250') menu = Menu(window) new_item = Menu(menu) new_item.add_command(label='Новый') new_item.add_separator() new_item.add_command(label='Изменить') menu.add_cascade(label='Файл', menu=new_item) window.config(menu=menu) window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

Теперь мы добавляем еще один пункт меню “Изменить” с разделителем меню. Вы можете заметить пунктирную линию в начале, если вы нажмете на эту строку, она отобразит пункты меню в небольшом отдельном окне.

Можно отключить эту функцию, с помощью tearoff подобным образом:

new_item = Menu(menu, tearoff=0) 

Просто отредактируйте new_item , как в приведенном выше примере и он больше не будет отображать пунктирную линию.
Вы так же можете ввести любой код, который работает, при нажатии пользователем на любой элемент меню, задавая свойство команды.

new_item.add_command(label='Новый', command=clicked) 

Добавление виджета Notebook (Управление вкладкой)

Для удобного управления вкладками реализуйте следующее:

  • Для начала, создается элемент управления вкладкой, с помощью класса Notebook .
  • Создайте вкладку, используя класс Frame .
  • Добавьте эту вкладку в элемент управления вкладками.
  • Запакуйте элемент управления вкладкой, чтобы он стал видимым в окне.
from tkinter import * from tkinter import ttk window = Tk() window.title("Добро пожаловать в приложение PythonRu") window.geometry('400x250') tab_control = ttk.Notebook(window) tab1 = ttk.Frame(tab_control) tab_control.add(tab1, text='Первая') tab_control.pack(expand=1, fill='both') window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

Таким образом, вы можете добавлять столько вкладок, сколько нужно.

Добавление виджетов на вкладку

После создания вкладок вы можете поместить виджеты внутри этих вкладок, назначив родительское свойство нужной вкладке.

from tkinter import * from tkinter import ttk window = Tk() window.title("Добро пожаловать в приложение PythonRu") window.geometry('400x250') tab_control = ttk.Notebook(window) tab1 = ttk.Frame(tab_control) tab2 = ttk.Frame(tab_control) tab_control.add(tab1, text='Первая') tab_control.add(tab2, text='Вторая') lbl1 = Label(tab1, text='Вкладка 1') lbl1.grid(column=0, row=0) lbl2 = Label(tab2, text='Вкладка 2') lbl2.grid(column=0, row=0) tab_control.pack(expand=1, fill='both') window.mainloop() 

Обучение Python GUI (уроки по Tkinter)

Добавление интервала для виджетов (Заполнение)

Вы можете добавить отступы для элементов управления, чтобы они выглядели хорошо организованными с использованием свойств padx и pady .

Передайте padx и pady любому виджету и задайте значение.

lbl1 = Label(tab1, text= 'label1', padx=5, pady=5) 

Это очень просто!

В этом уроке мы увидели много примеров GUI Python с использованием библиотеки Tkinter. Так же рассмотрели основные аспекты разработки графического интерфейса Python. Не стоит на этом останавливаться. Нет учебника или книги, которая может охватывать все детали. Надеюсь, эти примеры были полезными для вас.

  • ТЕГИ
  • Tkinter
  • графический интерфейс (GUI)
  • для начинающих

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *