Средняя
общеобразовательная школа №14 г о Подольск МО
Методические рекомендации с примерами
программных кодов на языке Python
GUI (уроки по Tkinter)
для учащихся 8-11 классов (часть1)
Подготовил:
Учитель высшей категории
Глушков Николай Васильевич
предмет : информатика
Г
Подольск
2020 г
С
О Д Е Р Ж А Н И Е
Введение
Раздел 1. Библиотека Tkinter
Раздел 2. Класс Tk Создание простых окон Свойства
окон
Раздел 3. Общее для всех виджетов. Создание окон с текстом и кнопками.
Функциональные кнопки Примеры.
3.1 Методы виджетов. Примеры
Раздел 4.»Системные методы»
Раздел 5 Справка по Основным виджетам с примерами
o
Введение
Автор Рекомендаций в свое время на учительском сайте «Инфоурок»
подготовил две методические разработки по объектно-ориентированному
программированию используя модуль tkinter для работы с графической
библиотекой Tk, Задача данных рекомендаций познакомить и облегчить
обучающимся написание основных учебных кодов (скриптов) для математических,
физических и экономических задач в интерактивной оболочке. Для обучающихся в
школе эта справочная база примеров поможет более углубленно и наглядно изучить
библиотеку Tkinter и в дальнейшем самостоятельно использовать
данный материал в web-приложениях .
Раздел 1. Библиотека Tkinter
В этой разработке показано как создаются графические
пользовательские интерфейсы, с помощью некоторых примеров графического
интерфейса Python с использованием библиотеки Tkinter.
Tkinter – это
кроссплатформенная библиотека для разработки графического интерфейса на языке
Python (начиная с Python 3.0 переименована в tkinter). Tkinter
расшифровывается как Tk interface, и является интерфейсом к Tcl/Tk.
Tkinter входит в стандартный дистрибутив Python
Tkinter (от англ. tk interface) - это графическая библиотека,
позволяющая создавать программы с оконным интерфейсом и может быть
использована в большинстве распространённых операционных систем (Windows,
Linux, Mac OS X и др.).
Начиная
с версии python-3.0 библиотека переименована в соответствии с PEP 8 в tkinter
(с маленькой буквы).Импортируется она как и любая другая библиотека:
# для версии python 2.7 и ниже
import Tkinter
# для версии python 3.0 и выше
import tkinter
В Tkinter визуальные контроллы называются
виджетами (widget, от англ. window gadget) - стандартизированный компонент графического
интерфейса, с которым взаимодействует пользователь. К ним относятся: Button – кнопки с управлением , Label - виджет, предназначенный для
отображения какой-либо надписи без возможности редактирования пользователем.
Имеет те же свойства, что и кнопки, List, radioButton и т.д.
Раздел 2. Класс Tk Создание простых
окон Свойства окон
Tk
является базовым классом любого Tkinter приложения. При создании объекта этого
класса запускается интерпретатор tcl/tk и создаётся базовое окно приложения.
Tkinter
является событийно-ориентированной библиотекой. В приложениях такого типа
имеется главный цикл обработки событий. В Tkinter такой цикл запускается
методом mainloop. Для явного выхода из интерпретатора и завершения цикла
обработки событий используется метод quit.
Таким образом минимальное приложение на Tkinter будет таким:
Пример1 Создание окна через root.mainloop()
from tkinter import *
root = Tk()
root.mainloop()
Пример 1.1 Свойства окна
from tkinter import *
def window_deleted():
print ('Окно закрыто')
root.quit() # явное указание на выход из
программы
root=Tk()
root.title('Пример приложения')
root.geometry('500x400+300+200')
# ширина=500, высота=400, x=300, y=200
root.protocol('WM_DELETE_WINDOW', window_deleted)
# обработчик закрытия окна
root.resizable(True, False) #
размер окна может быть изменён только по горизонтали
root.mainloop()
В
приложении можно использовать несколько интерпретаторов tcl/tk. Так как после
вызова метода mainloop дальнейшие команды python исполняться не будут до выхода
из цикла обработки событий, необходимо метод mainloop всех интерпретаторов
кроме последнего осуществлять в фоновом режиме.
Пример 2 Запуск двух интерпретаторов:
from tkinter
import *
root1 =
Tk()
root2 =
Tk()
# первый цикл запускаем в фоне
root1.after(500, root1.mainloop)
root2.mainloop()
При использовании двух и более интерпретаторов необходимо
следить, чтобы объекты, созданные в одном интерпретаторе, использовались только
в нём. Например, изображение, созданное в первом интерпретаторе, может быть
использовано много раз в этом же интерпретаторе, но не может быть использовано
в других интерпретаторах.
Пример 3. Создание окна через window.mainloop()
from tkinter import *
window = Tk()
window.title("Добро
пожаловать
в приложение PythonRu")
window.mainloop()
Раздел 3 . Общее
для всех виджетов. Создание окон с текстом и кнопками. Функциональные кнопки
Примеры.
Все виджеты в Tkinter обладают некоторыми общими свойствами.
Опишем их, перед тем как перейти к рассмотрению конкретных виджетов. Виджеты
создаются вызовом конструктора соответствующего класса. Первый аргумент (как
правило неименованный, но можно использовать имя master) это
родительский виджет, в который будет упакован (помещён) наш виджет.
Родительский виджет можно не указывать, в таком случае будет использовано главное
окно приложения. Далее следуют именованные аргументы, конфигурирующие виджет.
Это может быть используемый шрифт (font=...), цвет виджета (bg=...), команда,
выполняющаяся при активации виджета (command=...) и т.д. Полный список всех
аргументов можно посмотреть в man options и
man-странице соответствующего виджета (например man
button, см. разделы "STANDARD OPTIONS" и
"WIDGET-SPECIFIC OPTIONS"). Пример кода:
Пример 4 Создать окно в цвете через label.mainloop()
Свойства Label: текст, цвет фона и шрифта,
отступы по x ,y,
размер шрифта
from tkinter import Label
label = Label(None,text='Hello привет -это
окно ',
background="yellow", foreground="blue",
padx="40", pady="40", font="16")
label.pack()
label.mainloop()
Задание1 : Изменить
дизайн окна
через label.mainloop()
А вот
самая простая кнопка
import Tkinter
Tkinter._test()
После выполнения данного кода должно появиться следующее окно:
Отлично, теперь можно приступать к написанию нескольких простых программ для
демонстрации основных принципов Tkinter.
Hello
world
Конечно, куда же без него. Первым делом нам нужно создать главное окно, написав
Пример 4.1
Окно с
кнопкой
from Tkinter import *
root = Tk()
def Hello(event):
print "Yet
another hello world"
btn
= Button(root, #родительское
окно
text="Click me", #надпись
на кнопке
width=30,height=5, #ширина и
высота
bg="white",fg="black") #цвет
фона и
надписи
btn.bind("<Button-1>",
Hello) #при нажатии ЛКМ на кнопку вызывается функция Hello
btn.pack()
#расположить кнопку на главном окне
root.mainloop()
Всё просто, не так ли? Создаём экземпляр класса Button,
указываем родителя и при желании список параметров. Есть еще немало параметров,
таких как шрифт, толщина рамки и т.д.
Затем привязываем к нажатию на кнопку событие (можно привязать несколько разных
событий в зависимости, например, от того, какой кнопкой мыши был нажат наш btn.
mainloop() запускает цикл обработки событий; пока мы не вызовем эту функцию,
наше окно не будет реагировать на внешние раздражители.
Пример
5 Создание окна через root.mainloop()
и кнопки
с надписью
которая через функцию печатает текст
from Tkinter import *
def button_clicked():
print (u"Клик!")
root=Tk()
# кнопка по умолчанию
button1 =
Button()
button1.pack()
# кнопка с указанием родительского
виджета и несколькими аргументами
button2 =
Button(root, bg="red",
text=u"Кликни
меня!", command=button_clicked)
button2.pack()
root.mainloop()
Задание 2 Создать окна c кнопкой через
label.mainloop()и
через window.mainloop
Пример
6 Создание надписи в окне через window.mainloop()
Текст
надписи через lbl = Label(window,
text="Привет", font=("Arial Bold",
50))
from tkinter import *
window = Tk()
window.title("Добро
пожаловать в
приложение PythonRu")
lbl = Label(window,
text="Привет",
font=("Arial Bold", 50))
lbl.grid(column=0,
row=0)
window.mainloop()
Задание 3 : Сменить
дизайн в
примере 6
Пример 7. Окно с кнопкой (Описание свойств кнопки)
from tkinter import
*
root = Tk()
root.title("GUI на
Python")
root.geometry("300x250")
btn =
Button(text="Hello", # текст
кнопки
background="#555",
# фоновый цвет кнопки
foreground="#ccc", # цвет текста
padx="20", # отступ от границ до содержимого по
горизонтали
pady="8", # отступ от границ до содержимого по вертикали
font="16" # высота шрифта
)
btn.pack()
root.mainloop()
Пример 7.1. Окно с кнопкой описание
# подключаем модуль tkinter
from
tkinter import *
# создаем
главное окно
root=Tk()
root.title("Моя
первая программа на tk")
root.geometry('300x100')
#
функция, выводящая приветствие
def
printText(event):
print('Привет!')
#
создаем объект типа кнопка (Button)
button1=Button(root,text='Вывод
текста',width=12, height=2)
#
связываем нажатие ЛКМ по кнопке с функцией вывода приветствия
button1.bind('<Button-1>',printText)
#
отображаем кнопку в главном окне (это самый простой способ)
button1.pack()
#
отобразим программу в бесконечном цикле, всегда в конце программы
root.mainloop()
Пример8
Окно с кнопкой и функцией, выводящей
приветствие
# подключаем модуль tkinter
from tkinter import *
# создаем
главное окно
root=Tk()
root.title("Моя
первая программа на tk")
root.geometry('300x100')
#
функция, выводящая приветствие
def printText(event):
print('Привет!')
#
создаем объект типа кнопка (Button)
button1=Button(root, text='Вывод
текста',width=12, height=2)
#
связываем нажатие ЛКМ по кнопке с функцией вывода приветствия
button1.bind('<Button-1>',
printText)
#
отображаем кнопку в главном окне (это самый простой способ)
button1.pack()
#
отобразим программу в бесконечном цикле, всегда в конце программы
root.mainloop()
Пример 9 Две
Кнопки
from tkinter import *
def button_clicked():
print ("Клик!")
root=Tk()
# кнопка
по умолчанию
button1 = Button()
button1.pack()
#
кнопка с указанием родительского виджета и
несколькими аргументами
button2 = Button(root, bg="red", text="Кликни
меня!",
command=button_clicked)
button2.pack()
root.mainloop()
Пример 10. Кнопка
с функцией
отзыва
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()
Виджет
Checkbutton - выбор по условию
Пример11
Кнопка выбор - 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()
Пример12 Окно с отзывом после клика
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()
Пример 13 Выбор позиций
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()
Пример 14. Прокрутка в окне Виджет Spinbox
from tkinter import *
window = Tk()
window.title("Добро пожаловать в приложение PythonRu")
window.geometry('600x350')
spin = Spinbox(window, from_=0, to=100, width=5)
spin.grid(column=0, row=0)
window.mainloop()
Пример 15 Анимация с кнопками
from tkinter import *
from tkinter import messagebox
def b1(event):
root.title("Python")
def b3(event):
root.title("JS")
root = Tk()
root.title("GUI на Python")
root.geometry("300x250")
message = StringVar()
python_lang = IntVar()
python_checkbutton = Checkbutton(text="Python", variable=python_lang,
onvalue=1, offvalue=0, padx=15, pady=10)
python_checkbutton.grid(row=0, column=0, sticky=W)
javascript_lang = IntVar()
javascript_checkbutton = Checkbutton(text="JavaScript",
variable=javascript_lang,
onvalue=1, offvalue=0, padx=15, pady=10)
javascript_checkbutton.grid(row=1, column=0, sticky=W)
vares = [[python_lang, 'python'], [javascript_lang, 'javascript']]
text = Text(width=25, height=5, bg="darkgreen", fg='white',
wrap=WORD)
text.grid(row=2, column=0, sticky=W)
def b1(event):
text.delete('1.0', END)
for ch in vares:
if ch[0].get():
text.insert(1.0, ch[1] + '\n')
def b3(event):
text.delete('1.0', END)
for ch in vares:
if not ch[0].get():
text.insert(1.0, ch[1] + '\n')
root.minsize(width = 500, height=400)
text.bind('<Button-1>',b1)
text.bind('<Button-3>',b3)
root.mainloop()
Пример 16 При нажатии на файл
выпадает «Новый»
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()
Пример 17 При нажатии на файл выпадает «Новый»- Изменить
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()
Пример 18 Окно с вкладками виджет tab_control =
ttk.Notebook(window
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()
Пример 19 матрешка из 3 –х окон
from tkinter import Label
label= Label(None,text='1 метка
Hello
привет – смени
окно
')
label.pack()
label.mainloop()
label= Label(None,text='2 метка
Hello привет смени
окно
')
label.pack()
label.mainloop()
label= Label(None,text=' 3 метка
привет
Закрой
меня
совсем
')
label.pack()
label.mainloop()
Пример
20 Две кнопки
- смена цвета
кнопки
(Матрешка)
from
tkinter import *
clicks = 0
def click_button():
global clicks
clicks += 1
root.title("Clicks
{}".format(clicks))
root = Tk()
root.title("
1 - кнопка")
root.geometry("300x250")
btn = Button(text="Нажми , нажми
и закрой
-смени цвет ", background="red", foreground="yellow",
padx="20",
pady="8", font="16",
command=click_button)
btn.pack()
root.mainloop()
def click_button():
global clicks
clicks += 1
root.title("Clicks
{}".format(clicks))
root = Tk()
root.title(" 2- кнопка")
root.geometry("150x150")
btn = Button(text="Нажми и
закрой окно", background="yellow", foreground="blue",
padx="40",
pady="40", font="16", command=click_button)
btn.pack()
root.mainloop()
Пример 21 . Обработчик
событий
from tkinter import *
window = Tk()
window.title("Мое приложение")
window.geometry('350x200')
lbl = Label(window, text="Метка")
lbl.grid(column=0, row=0)
# текстовое поле
txt = Entry(window,width=10)
txt.grid(column=1, row=0)
def btnClicked():
lbl.configure(text="Вы нажали на кнопку!!!")
# window - ссылка на окно
# text - текст кнопки
# command - ссылка на обработчик нажатия клавиши
btn = Button(window, text="Нажмите на кнопку", command=btnClicked)
btn.grid(column=1, row=0)
window.mainloop()
Раздел 4 . Методы виджетов Примеры
configure, config
Виджеты
могут быть сконфигурированы во время создания, но иногда необходимо изменить
конфигурацию виджета во время исполнения программы. Для этого используется
метод configure (или его синоним config). Также
можно использовать квадратные скобки (widget['option'] = new_value).
Пример 22 программа выводит текущее время, после клика по кнопке:
from Tkinter
import *
import time
def button_clicked():
# изменяем
текст кнопки
button['text'] = time.strftime('%H:%M:%S')
root=Tk()
# создаём
виджет
button = Button(root)
# конфигурируем
виджет после
создания
button.configure(text=time.strftime('%H:%M:%S'),
command=button_clicked)
# также можно использовать квадратные
скобки:
# button['text'] = time.strftime('%H:%M:%S')
# button['command'] = button_clicked
button.pack()
root.mainloop()
В
этом коде функция button_clicked вызывается каждый раз, когда пользователь
кликает по кнопке.
cget
Метод
cget является обратным к методу configure. Он предназначен для получения
информации о конфигурации виджета. Здесь как и в случае с configure можно
использовать квадратные скобки (value = widget['option']).
Пример 23 После клика на кнопку программа показывает цвет кнопки и меняет
его на другой:
from Tkinter import *
from random import random
def button_clicked():
button['text'] = button['bg'] # показываем
предыдущий цвет
кнопки
bg = '#%0x%0x%0x' % (int(random()*16),
int(random()*16), int(random()*16))
button['bg'] = bg
button['activebackground'] = bg
root=Tk()
button = Button(root, command=button_clicked)
button.pack()
root.mainloop()
destroy
Уничтожение
виджета и
всех его
потомков. Стоит отметить, что если необходимо только на время спрятать
какой-либо виджет, то лучше пользоваться упаковщиком grid и методом
grid_remove:
Пример 24 При нажатии на кнопку текст
прячется пря
from Tkinter import *
def hide_show():
if label.winfo_viewable():
label.grid_remove()
else:
label.grid()
root=Tk()
label = Label(text=u'Я здесь!')
label.grid()
button = Button(command=hide_show,
text=u"Спрятать/показать")
button.grid()
root.mainloop()
Использование
grid_remove позволяет сохранять взаимное расположение виджетов.
grab_Методы семейства grab_
предназначены для управления потоком события. Виджет, захвативший поток, будет
получать все события окна или приложения.
Пример25
приложение захватывает глобальный поток и освобождает его через 10 секунд:
from Tkinter import *
root=Tk()
root.after(200, root.grab_set_global)
root.after(10000, root.grab_release)
root.mainloop()
focus
Методы
семейства focus_ используются для управления фокусом ввода с клавиатуры.
Виджет, имеющий фокус, получает все события с клавиатуры.
Раздел 4"Системные"
методы
Эти методы не
являются виджет-специфичными, т.е. хотя они являются методами виджетов они
влияют на работу интерпретатора tcl/tk.
after, after_idle и
after_cancel[3]
Таймеры. С помощью
этих методов вы можете отложить выполнение какого-нибудь кода на определённое
время.
Пример, 26 часы:
from Tkinter import *
import time
def tick():
label.after(200, tick)
label['text'] = time.strftime('%H:%M:%S')
root=Tk()
label = Label(font='sans 20')
label.pack()
label.after_idle(tick)
root.mainloop()
update и update_idletasks[4]
Две функции, для
работы с очередью задач. Их выполнение вызывает обработку отложенных задач.
update_idletasks выполняет задачи, обычно откладываемые
"на потом", когда приложение будет простаивать. Это приводит к
прорисовке всех виджетов, расчёту их расположения и т.д. Обычно эта функция
используется если были внесены изменения в состояние приложения, и вы хотите,
чтобы эти изменения были отображены на экране немедленно, не дожидаясь
завершения сценария.
update обрабатывает все задачи, стоящие в очереди.
Обычно эта функция используется во время "тяжёлых" расчётов, когда
необходимо чтобы приложение оставалось отзывчивым на действия пользователя.
Раздел 5 Справка по Основным виджетам с примерами
Label
Label
- это виджет, предназначенный для отображения какой-либо надписи без
возможности редактирования пользователем. Имеет те же свойства, что и
перечисленные свойства кнопки.
Toplevel
Toplevel[5] - окно верхнего уровня. Обычно используется для
создания многооконных программ, а также для диалоговых окон Такие же окна
готовятся в Джаваскрипт при вводе данных или выводе
Методы виджета приведены в Курсе по библиотеке Tkinter языка Python
Эти же методы могут
быть использованы для корневого (root) окна.
Пример:
from Tkinter import *
def window_deleted():
print ('Окно закрыто')
root.quit() # явное указание на выход из программы
root=Tk()
root.title(u'Пример приложения')
root.geometry('500x400+300+200') # ширина=500, высота=400, x=300, y=200
root.protocol('WM_DELETE_WINDOW', window_deleted) # обработчик закрытия окна
root.resizable(True, False) # размер окна может быть изменён только по горизонтали
root.mainloop()
Пример Текст из модального окна
from tkinter import Tk, Toplevel, Button, Label
def
func():
top
= Toplevel(root)
button_top_level
= Button(top, text='Нажми',
command=lambda:
label.config(text='Текст из
модального
окна')).pack()
root
= Tk()
label
= Label(root, text='Текст')
label.pack()
button
= Button(root, text='openModal', command=func).pack()
root.mainloop()
Button
Виджет Button - самая
обыкновенная кнопка, которая используется в тысячах программ. Пример кода:
from Tkinter import *
root=Tk()
button1=Button(root,text='ok',width=25,height=5,bg='black',fg='red',font='arial 14')
button1.pack()
root.mainloop()
Разберем этот небольшой код. За создание, собственно, окна, отвечает класс Tk(), и первым делом нужно создать экземпляр этого класса. Этот экземпляр принято называть root, хотя вы можете назвать его как угодно. Далее создаётся кнопка, при этом мы указываем её свойства (начинать нужно с указания окна, в примере - root). Здесь перечислены некоторые из них:
text - какой текст будет отображён на кнопке (в примере - ок)
width,height - соответственно, ширина и длина кнопки.
·
bg - цвет кнопки (сокращенно от background, в примере цвет -
чёрный)
·
fg - цвет текста на кнопке (сокращённо от foreground, в примере
цвет - красный)
·
font - шрифт и его размер (в примере - arial, размер - 14)
Далее, нашу кнопку
необходимо разместить на окне. Для этого, в Tkinter используются
специальные упаковщики( pack(), place(), grid() ). Поподробнее об
упаковщиках узнаем позже. Пока, чтобы разместить несколько виджетов на окне,
будем применять самый простой упаковщик pack(). В конце программы, нужно
использовать функцию mainloop (см. пример), иначе окно не будет создано..
Entry
Entry - это виджет,
позволяющий пользователю ввести одну строку текста. Имеет дополнительное
свойство bd (сокращённо от borderwidth), позволяющее регулировать ширину
границы.
·
borderwidth - ширина бордюра
элемента
·
bd - сокращение от borderwidth
·
width - задаёт длину
элемента в знакоместах.
·
show - задает
отображаемый символ.
Text
Text - это виджет, который позволяет
пользователю ввести любое количество текста. Имеет дополнительное свойство
wrap, отвечающее за перенос (чтобы, например, переносить по словам, нужно
использовать значение WORD).Например:
from Tkinter import *
root=Tk()
text1=Text(root,height=7,width=7,font='Arial 14',
wrap=WORD)
text1.pack()
root.mainloop()
Методы insert, delete и get добавляют, удаляют
или извлекают текcт. Первый
аргумент - место вставки в виде 'x.y', где x – это строка, а y – столбец.
Например:
text1.insert(1.0,'Добавить Текст\n\ в начало первой строки')
text1.delete('1.0', END) # Удалить все
text1.get('1.0', END) # Извлечь все
Listbox
Listbox - это виджет,
который представляет собой список, из элементов которого пользователь может
выбирать один или несколько пунктов. Имеет дополнительное свойство selectmode,
которое, при значении SINGLE, позволяет пользователю выбрать только один
элемент списка, а при значении EXTENDED - любое количество. Пример:
from Tkinter import *
root=Tk()
listbox1=Listbox(root,height=5,width=15,selectmode=EXTENDED)
listbox2=Listbox(root,height=5,width=15,selectmode=SINGLE)
list1=[u"Москва",u"Санкт-Петербург",u"Саратов",u"Омск"]
list2=[u"Канберра",u"Сидней",u"Мельбурн",u"Аделаида"]
for i in list1:
listbox1.insert(END,i)
for i in list2:
listbox2.insert(END,i)
listbox1.pack()
listbox2.pack()
root.mainloop()
Стоит заметить, что в
этой библиотеке для того, чтобы использовать русские буквы в строках, нужно
использовать Unicode-строки. В Python 2.x для этого нужно перед строкой
поставить букву u, в Python 3.x этого делать вообще не требуется, т.к. все
строки в нем изначально Unicode. Кроме того в первой или второй строке файла
необходимо указать кодировку файла (в комментарии): coding: utf-8.
Чаще всего используется формат в стиле текстового редактора emacs:
В Python 3.x
кодировку файла можно не указывать, в этом случае по умолчанию предполагается
utf-8.
Frame
Виджет Frame (рамка)
предназначен для организации виджетов внутри окна. Рассмотрим пример:
from tkinter import *
root=Tk()
frame1=Frame(root,bg='green',bd=5)
frame2=Frame(root,bg='red',bd=5)
button1=Button(frame1,text=u'Первая кнопка')
button2=Button(frame2,text=u'Вторая кнопка')
frame1.pack()
frame2.pack()
button1.pack()
button2.pack()
root.mainloop()
Свойство bd отвечает за толщину края
рамки.
Checkbutton
Checkbutton - это виджет, который позволяет
отметить „галочкой“
определенный пункт в окне. При использовании нескольких пунктов
нужно каждому присвоить свою переменную. Разберем пример:
from tkinter import *
root=Tk()
var1=IntVar()
var2=IntVar()
check1=Checkbutton(root,text=u'1 пункт',variable=var1,
onvalue=1,offvalue=0)
check2=Checkbutton(root,text=u'2 пункт',
variable=var2,onvalue=1,offvalue=0)
check1.pack()
check2.pack()
root.mainloop()
IntVar() -
специальный класс библиотеки для работы с целыми числами. variable - свойство,
отвечающее за прикрепление к виджету переменной. onvalue, offvalue - свойства,
которые присваивают прикреплённой к виджету переменной значение, которое
зависит от состояния(onvalue - при выбранном пункте, offvalue - при невыбранном
пункте).
Radiobutton
Виджет Radiobutton
выполняет функцию, схожую с функцией виджета Checkbutton. Разница в том, что в
виджете Radiobutton пользователь может выбрать лишь один из пунктов. Реализация
этого виджета несколько иная, чем виджета Checkbutton:
В этом виджете
используется уже одна переменная. В зависимости от того, какой пункт выбран,
она меняет своё значение. Самое интересное, что если присвоить этой переменной
какое-либо значение, поменяется и выбранный виджет.
from tkinter import *
root=Tk()
var=IntVar()
rbutton1=Radiobutton(root,text='1',variable=var,value=1)
rbutton2=Radiobutton(root,text='2',variable=var,value=2)
rbutton3=Radiobutton(root,text='3',variable=var,value=3)
rbutton1.pack()
rbutton2.pack()
rbutton3.pack()
root.mainloop().
Scale
Scale (шкала) - это
виджет, позволяющий выбрать какое-либо значение из заданного диапазона.
Свойства:
·
orient - как расположена шкала на окне. Возможные значения:
HORIZONTAL, VERTICAL (горизонтально, вертикально).
·
length - длина шкалы.
·
from_ - с какого значения начинается шкала.
·
to - каким значением заканчивается шкала.
·
tickinterval - интервал, через который отображаются метки шкалы.
·
resolution - шаг передвижения (минимальная длина, на которую
можно
передвинуть движок)
Пример кода:
Здесь используется
специальный метод get(), который позволяет снять
с виджета определенное значение, и используется не только в Scale.
Scrollbar
Этот виджет даёт
возможность пользователю "прокрутить" другой виджет (например
текстовое поле) и часто бывает полезен. Использование этого виджета достаточно
нетривиально. Необходимо сделать две привязки: command полосы прокрутки
привязываем к методу xview/yview виджета, а xscrollcommand/yscrollcommand
виджета привязываем к методу set полосы прокрутки.
Рассмотрим на
примере:
from tkinter import *
root = Tk()
text = Text(root, height=3, width=60)
text.pack(side='left')
scrollbar = Scrollbar(root)
scrollbar.pack(side='left')
# первая привязка
scrollbar['command'] = text.yview
# вторая привязка
text['yscrollcommand'] = scrollbar.set
root.mainloop()
Упаковщики
Функция pack() — это так называемый упаковщик,
или менеджер расположения. Он отвечает за то, как виджеты будут располагаться
на главном окне. Для каждого виджета нужно вызвать метод упаковщика, иначе он
не будет отображён. Всего упаковщиков три:
pack(). Автоматически размещает виджеты в родительском окне. Имеет параметры side,
fill, expand. Пример:
from
Tkinter
import *
root = Tk()
Button(root, text =
'1').pack(side
=
'left')
Button(root, text =
'2').pack(side =
'top')
Button(root, text =
'3').pack(side =
'right')
Button(root, text =
'4').pack(side =
'bottom')
Button(root, text =
'5').pack(fill =
'both')
root.mainloop()
grid(). Размещает виджеты на сетке. Основные параметры: row/column –
строка/столбец в сетке, rowspan/columnspan – сколько
строк/столбцов занимает виджет. Пример:
from Tkinter
import *
root = Tk()
Button(root, text =
'1').grid(row =
1, column =
1)
Button(root, text =
'2').grid(row =
1, column =
2)
Button(root, text =
'__3__').grid(row =
2, column =
1, columnspan =
2)
root.mainloop()
place(). Позволяет размещать виджеты в указанных координатах с указанными
размерами.
Основные параметры: x,
y, width, height. Пример:
from Tkinter
import *
root = Tk()
Button(root, text =
'1').place(x =
10, y =
10, width =
30)
Button(root, text =
'2').place(x =
45, y =
20, height =
15)
Button(root, text =
'__3__').place(x =
20, y =
40)
root.mainloop()
Клавиатурные символы
Полный
список см. man keysyms.
Примеры
<Button-1> или <1> -
нажата левая клавиша мыши.
<Alt-Motion> -
движение мышью с нажатой на клавиатуре клавишей Alt.
<Key> - нажатие любой клавиши на клавиатуре.
Пример:
from Tkinter import *
root=Tk()
def leftclick(event):
print u'Вы нажали левую
кнопку мыши'
def rightclick(event):
print u'Вы нажали правую
кнопку мыши'
button1=Button(root, text=u'Нажми')
button1.pack()
button1.bind('<Button-1>', leftclick)
button1.bind('<Button-3>', rightclick)
root.mainloop()
Дополнительные методы
·
bind_all - создаёт привязку для всех
виджетов приложения. Отличие от привязки к окну верхнего уровня заключается в
том, что в случае привязки к окну привязываются все виджеты этого окна, а этот
метод привязывает все виджеты приложения (у приложения может быть несколько
окон).
·
bind_class - создаёт привязку для
всех виджетов данного класса
Пример:
from Tkinter import *
def callback(e):
print ('Нажата кнопка', e.widget['text'])
root=Tk()
button1 = Button(root, text='1')
button1.pack()
button2 = Button(root, text='2')
button2.pack()
root.bind_class('Button', '<1>', callback)
root.mainloop()
·
bindtags - позволяет изменить порядок
обработки привязок. По умолчанию порядок следующий: виджет, класс, окно, all;
где виджет - привязка к виджету (bind), класс - привязка к классу (bind_class),
окно - привязка к окну (root.bind), all - привязка всех виджетов (bind_all).
Пример,
меняем порядок обработки привязок на обратный:
from Tkinter import *
def callback1(e): print 'callback1'
def callback2(e): print 'callback2'
def callback3(e): print 'callback3'
def callback4(e): print 'callback4'
root=Tk()
button = Button(root)
button.pack()
button.bind('<1>', callback1)
root.bind_class('Button', '<1>', callback2)
root.bind('<1>', callback3)
root.bind_all('<1>', callback4)
button.bindtags(('all', root, 'Button', button))
root.mainloop()
·
unbind - отвязать виджет от события. В
качестве аргумента принимает идентификатор, полученный от метода bind.
·
unbind_all - то же, что и unbind,
только для метода bind_all.
·
unbind_class - то же, что и unbind,
только для метода bind_class.
Изображения
Для работы с
изображениями в Tkinter имеется два класса BitmapImage и PhotoImage.
BitmapImage представляет собой простое двухцветное изображение, PhotoImage - полноцветное
изображение.
BitmapImage
Конструктор класса
принимает следующие аргументы:
·
background и foreground - цвета фона и переднего плана для
изображения. Поскольку изображение двухцветное, то эти параметры определяют
соответственно чёрный и белый цвет.
·
file и maskfile - пути к файлу с изображением и к маске
(изображению, указывающему какие пиксели будут прозрачными).
·
data и maskdata - вместо пути к файлу можно указать уже
загруженные в память данные изображения. Данная возможность удобна для
встраивания изображения в программу.
Пример:
from Tkinter import *
data = '''#define image_width 15
#define image_height 15
static unsigned char image_bits[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x38, 0x1c, 0x30, 0x0c, 0x60, 0x06,
0x60, 0x06, 0xc0, 0x03, 0xc0, 0x03,
0x60, 0x06, 0x60, 0x06, 0x30, 0x0c,
0x38, 0x1c, 0x00, 0x00, 0x00, 0x00 };'''
root=Tk()
image = BitmapImage(data=data,
background='red', foreground='green')
button=Button(root, image=image)
button.pack()
root.mainloop()
PhotoImage
PhotoImage позволяет
использовать полноцветное изображение. Кроме того у
этого класса есть несколько (достаточно примитивных) методов для работы с
изображениями. PhotoImage гарантированно понимает формат GIF.
Аргументы
конструктора:
·
file - путь к файлу с изображением.
·
data - вместо пути к файлу можно
указать уже загруженные в память данные изображения. Изображения в формате GIF
могут быть закодированы с использованием base64. Данная возможность удобна для
встраивания изображения в программу.
·
format - явное указание формата
изображения.
·
width, height - ширина и высота
изображения.
·
gamma - коррекция гаммы.
·
palette - палитра изображения.
Combobox
Виджет Combobox
предназначен для отображения списка значений, их выбора или изменения
пользователем. В версии tk ему подобен виджет Listbox. Разница заключается в
том, что Combobox имеет возможность сворачиваться подобно свитку, а Listbox
будет отображаться всегда открытым. Что бы отобразить Combobox с заранее
заданными значениями в форме, достаточно сделать следующее:
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
frame = tk.Frame(root)
frame.grid()
combobox = ttk.Combobox(frame,values = [u"ОДИН",u"ДВА",u"ТРИ"],height=3)
#frame - задает родительский виджет, на его территории будет располагаться Combobox
#values - задает набор значений, которые будут содержаться в Combobox изначально
#height - задает высоту выпадающего списка. Если число элементов списка меньше 11, то можно не задавать.
#Если не задано при количестве элементов больше 10, то с правой стороны появится полоса прокрутки.
#Если в нашем примере задать значение height меньше трех, то с правой стороны появится полоса прокрутки,
#но она будет недоступна, а все элементы будут отображаться одновременно.
combobox.set(u"ОДИН")#с помощью этой строчки мы установим Combobox в значение ОДИН изначально
combobox.grid(column=0,row=0)#Позиционируем Combobox на форме
root.mainloop()
Progressbar
Виджет
отображает уровень загрузки (анимация)
·
length - длина полосы.
·
start
·
Запускает бесконечный цикл загрузки. Шаг длиною
1 выполняется один раз в указанное время (в миллисекундах).
·
stop
·
Останавливает цикл загрузки.
·
step
·
Продвигает загрузку на заданное количество шагов.
·
import tkinter as tk
·
import tkinter.ttk as ttk
·
root = tk.Tk()
·
pb = ttk.Progressbar(root, length=100)
·
pb.pack()
·
pb.start(100)
·
root.mainloop()
Заключение
В
данной методической разработке (часть 1 ) представлен основной материал по
созданию примеров в объектно-ориентированном аспекте на языке Питон с помощью
библиотеки Tkinter. Целью данной работы является
систематизация теоретического материала для практического и справочного его
применения.
Начинающий программист найдет здесь нужный теоретический материал, выберет
практические примеры и ссылки на интернет источники. Задачей автора является не
только познакомить обучающихся школ с языком программирования Питон, но и
направить их на дальнейшее исследование в программировании. Тем более этот
материал с интерактивными примерами является основой разработки web-
приложений. В интернет ресурсах имеется богатый теоретический материал для
дальнейшего создания движков на языке Питон. Желаю успехов в освоении и
изучении языка Питон и его библиотек.
Используемые
ссылки:
1
Курс по библиотеке Tkinter языка Python https://wikiversity.wikia.org/language-wikis
https://ru.wikiversity.org/wiki/Курс_по_библиотеке_Tkinter_языка_Python
2. Обучение Python GUI (уроки по Tkinter) http://espressocode.top/python-gui-tkinter/
https://pythonru.com/uroki/obuchenie-python-gui-uroki-po-tkinter
3.
Введение в Tkinter , Хабр https://habr.com/ru/post/133337/
4. Форум программистов https://www.cyberforum.ru/python-graphics/thread2411899.html
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.