Библиотека tkinter в языке программирования Python позволяет создавать графические приложения.Элементы графического интерфейса в терминологии tkinter называются виджетами.
Импортирование библиотеки tkinter в Python 3 может производится следующей строкой кода:
from tkinter import *
Класс Tk - это базовый объект,вызов которого продуцирует окно приложения.
Событийная ориентированность библиотеки tkinter подразумевает,что действия пользователя должным образом в главном цикле приложения обрабатываются и вызывают соответствующий код,определенный программистом.
Для обработки событий организуется цикл,который в библиотеке tkinter называется mainloop().
В библиотеке tkinter существует большое количество виджетов,которые можно использовать в своих программах.
Создать окно верхнего уровня и закрыть программу можно с помощью такого кода:
from tkinter import *
def window_quit():
root.quit()
root=Tk()
root.title('Окно верхнего уровня')
root.geometry('500x500+0+0')
root.protocol('WM_DELETE_WINDOW', window_quit)
root.mainloop()
Переменная root позволяет выполнять манипуляции с окном.
Строка кода root.title('Окно верхнего уровня') - задаёт заголовок окна.Вместо текстовой строки 'Окно верхнего уровня' можно ввести любой текст,который захочет программист.
Строка кода root.geometry('500x500+0+0') - создаёт окно верхнего уровня шириной и высотой 500 пикселей.X-кордината равна нулю,также как и Y-координата.
Строка кода root.protocol('WM_DELETE_WINDOW', window_quit) - указывает функцию во втором аргументе,которая выполняется при наступлении события,указанного в первом аргументе.В данном случае событие называется WM_DELETE_WINDOW,которое возникает при уничтожении окна верхнего уровня.Функция window_quit завершает выполнение программы с помощью следующей строки кода root.quit().
Строка кода root.mainloop() - вводит программу в главный цикл обработки,без этой строки программа завершится моментально.
А теперь давайте поработаем с самым распространёным элементом в мире программирования графических интерфейсов - обыкновенной кнопкой.Этот элемент так и хочет,чтобы пользователь на него нажал.)))
from tkinter import *
def click():
print("hello")
root=Tk()
button1=Button(root,text=''hello",width=25,height=5,command=click)
button1.pack()
root.mainloop()
Для размещения кнопки в окне приложения использован упаковщик pack().
Текст кнопки указывается в именованном аргументе text c использованием знака равно,который в языке программирования Python является оператором присвоения.Ширина кнопки указывается в именованном аргументе width.Высота кнопки в именованном аргументе height.У кнопки существуют и другие свойства,которые может задать программист.Эти неупомянутые свойства определяются аналогичным способом.
Виджет Text - представляет собой поле для ввода произвольного текста.С помощью методов данного виджета можно добавлять,удалять и получать введенную пользователем информацию.Обработка введенной информации осуществляется посредством возможностей,заложенных в языке программирования Python.
from tkinter import *
def insert_text():
text1.insert(1.0,'Текст,заданный пользователем')
def delete_text():
print(text1.get('1.0', END)) #вывести в консоль содержимое поля
text1.delete('1.0', END) # очистить текстовое поле
root=Tk()
text1=Text(root,font='Arial 14') # установить используемый шрифт
text1.pack(side=LEFT)
button1=Button(root,text='добавить текст',font='arial 14',command=insert_text)
button2=Button(root,text='удалить текст',font='arial 14',command=delete_text)
button1.pack()
button2.pack()
root.mainloop()
Checkbutton - графический элемент,который используется для выделения пункта галочкой.Эта самая галочка показывает,что пункт выбран и может соответствующим образом обрабатываться в программе.Каждый отдельный виджет Checkbutton имеет состояние,при котором он выделен,и состояние,при котором он не выделен.Отдельно от виджета Checkbutton должна быть определена переменная состояния,которая указывается в свойстве variable.Свойство onvalue - указывает значение,что данный виджет будет принимать при включенном состоянии.Свойство offvalue - указывает значение,которое будет приниматься при выключенном состоянии.
from tkinter import *
def set_window():
global var_x,var_y
if (boolsize.get() == 1): # проверка на включение флага
var_x = var_x + 10
var_y = var_y + 10
if (boolsize.get() == 0): # проверка на выключение флага
var_x = var_x - 10
var_y = var_y - 10
root.geometry(str(var_x)+"x"+str(var_y)) # формирование размеров окна
root=Tk()
var_x = 250
var_y = 250
root.geometry("250x250")
boolsize=BooleanVar() # переменная,хранящая флаг перестройки окна
check1=Checkbutton(root,text='флаг перестройки окна на 10 пикселей',variable=boolsize,onvalue=1,offvalue=0)
button1=Button(root,text='перестроить окно',font='arial 14',command=set_window)
check1.pack()
button1.pack()
root.mainloop()
Radiobutton - графический элемент,который позволяет выбрать один и только один пункт из группы пунктов.То есть,невозможно выбрать сразу два пункта.В этом и проявляется главные отличие виджета Radiobutton от виджета Checkbutton.Здесь тоже имеется свойство variable,которое определяет выбор пользователя.Свойство value - присваивает свойству variable значение,которое в языке программирования Python можно обработать с помощью оператора ветвления if.
from tkinter import *
def set_window():
global var_x,var_y
if (var.get() == 1):
var_x = var_x + 10
var_y = var_y + 10
if (var.get() == 2):
var_x = var_x + 25
var_y = var_y + 25
if (var.get() == 3):
var_x = var_x + 50
var_y = var_y + 50
root.geometry(str(var_x)+"x"+str(var_y))
root=Tk()
var_x = 250
var_y = 250
root.geometry("250x250")
var=IntVar()
rbutton1=Radiobutton(root,text='увеличение на 10 px',variable=var,value=1)
rbutton2=Radiobutton(root,text='увеличение на 25 px',variable=var,value=2)
rbutton3=Radiobutton(root,text='увеличение на 50px',variable=var,value=3)
button1=Button(root,text='перестроить окно',font='arial 14',command=set_window)
rbutton1.pack()
rbutton2.pack()
rbutton3.pack()
button1.pack()
root.mainloop()
Переменная имеет в листинге выше уже не определяется,как логическая(булевская) переменная,а имеет целочисленное значение,так как три принимаемые ей значения не вписывается в парадигму состояния включения(1,"да") и выключения(0,"нет"),приобретает троичную парагдигму("да","нет","не знаю").
Listbox - графический элемент,позволяющий выбрать один или совокупность пунктов.Если значение свойства selectmode равно SINGLE,то в данном виджете можно выделить только один пункт.В противном случае свойство selectmode принимает значение EXTENDED,которое даёт возможность множественного выбора.
from tkinter import *
def set_window():
var = listbox1.curselection()[0] # получение выбранного пункта
global var_x,var_y
if (var == 0):
var_x = var_x + 10
var_y = var_y + 10
if (var == 1):
var_x = var_x + 25
var_y = var_y + 25
if (var == 2):
var_x = var_x + 50
var_y = var_y + 50
root.geometry(str(var_x)+"x"+str(var_y))
root=Tk()
var_x = 250
var_y = 250
root.geometry("250x250")
listbox1=Listbox(root,height=5,width=25,selectmode=SINGLE)
list1=["увеличение на 10 пикселей","увеличение на 25 пикселей","увеличение на 50 пикселей"]
for i in list1:
listbox1.insert(END,i) # добавление списка элементов
listbox1.pack()
button1=Button(root,text='перестроить окно',font='arial 14',command=set_window)
button1.pack()
root.mainloop()
Для заполнения текстовыми пунктами экземпляра Listbox в листинге выше использован цикл for.Этот цикл последовательно формирует текстовые пункты,беря текст из списка(list),который очень похож на конструкцию массивов в языках отличных от языка Python.
Многие примеры использования виджетов в данном обзоре адаптировались к увеличению окна приложения на определенное число пикселей в зависимости от того,какой выбор сделал пользователь.В следующем примере используется виджет Listbox в качестве платформы для выбора не изменения размера окна,а выбора фонового цвета.
from tkinter import *
def set_window():
var = listbox1.curselection()[0] # получение выбранного пункта
if (var == 0):
root.configure(background='red')
if (var == 1):
root.configure(background='green')
if (var == 2):
root.configure(background='blue')
root=Tk()
root.geometry("250x250")
listbox1=Listbox(root,height=5,width=25,selectmode=SINGLE)
list1=["красный","зеленый","синий"]
for i in list1:
listbox1.insert(END,i)
listbox1.pack()
button1=Button(root,text='перекрасить окно',font='arial 14',command=set_window)
button1.pack()
root.mainloop()
Menu - графический элемент,представляющий из себя список текстовых пунктов,к которым можно привязать функцию,что будет выполняться при клике на пункт.Привязать функцию к пункту меню можно с помощью свойства command.Метод add_command() добавляет пункты в меню.Также главное меню нужно привязать к окну приложения,а то он не будет видим,следовательно с ним невозможно будет взаимодействовать пользователю.
from tkinter import *
from tkinter import messagebox
import sys
def mycommand1():
messagebox.showinfo("Сообщение", "Вы кликнули первый пункт меню")
def mycommand2():
res = messagebox.askquestion("Сообщение", "Вы действительно хотите завершить программу?")
if res == 'yes':
root.destroy()
sys.exit()
else:
messagebox.showinfo("Сообщение", "вы отменили выход из программы")
root = Tk()
mainmenu = Menu() # создание главного экземляра меню
root.config(menu=mainmenu) #привязка к главному окну
submenu = Menu(mainmenu,tearoff=0) #создание подменю
submenu.add_command(label="Первая команда",command=mycommand1)
submenu.add_command(label="Вторая команда",command=mycommand2)
mainmenu.add_cascade(label="Команды", menu=submenu) #добавление подменю в главное меню
root.mainloop()
|