-
Зміст
Посилання
1. Загальні поняття
Tkinter (від англійського Tk interface) — це багатоплатформна (Windows, Linux, Mac OS X і інші) бібліотека мови Python, що є інтерфейсом до tcl / tk і слугує для створення програм з графічним інтерфейсом.
Tcl (Tool Command Language) — це потужна багатоплатформна мова програмування веб- і настільних застосунків, роботи мережі, адміністрування, тестування тощо.
Tk — це графічний набір інструментів для створення інтерфейсу на вищому від традиційних підходів рівні. Придатний не лише для Tcl, але і для багатьох інших динамічних мов.
Віджет (widget, від англійського Window gadget) — елемент керування — стандартизований компонент графічного інтерфейсу, з яким взаємодіє користувач.
Клас Tk — основний клас застосунку Tkinter. При створенні об'єкта цього класу буде завантажено інтерпретатор tcl/tk і створено основне вікно програми.
Tkinter є подійно-орієнтованою бібліотекою. При її використанні головним є цикл опрацювання подій. У tkinter такий цикл:
2. Імпорт tkinter і виклик циклу опрацювання подій
Імпорт tkinter здійснюють таким самим чином, як і будь-якої іншої бібліотек, але по різному для різних версій Python:
Дія мінімальної програми з tkinter:
from tkinter import * root = Tk () root.mainloop ()
буде такою:
Можна використовувати кілька викликів інтерпретатора tcl/tk. Після виклику методу mainloop подальші вказівки python не буде виконано до виходу з цього циклу опрацювання подій. Тому методи mainloop, крім останнього, потрібно здійснювати у режимі тла. Наприклад, таким чином:
from tkinter import * root1 = Tk () root2 = Tk () root1.after (500, root1.mainloop) root2.mainloop ()
При використанні двох чи більше викликів інтерпретатора необхідно, щоб об'єкти, створені в одному циклі mainloop, було використано лише в ньому. Необхідність використання кількох циклів у одному застосунку виникає вкрай рідко. Для створення додаткового вікна програми у більшості випадків досить віджета Toplevel.
Примітка. Для того, щоб використовувати літери кирилиці, потрібно використовувати рядки з кодуванням Unicode. У Python 2.x для цього потрібно перед рядком писати літеру u. Також у першому чи другому рядку файлу необхідно вказати (в коментарі) кодування файлу:
# Encoding: utf-8
У Python 3.x цього робити не потрібно, бо всі рядки в ньому мають кодування Unicode.
3. Створення елемента керування
Елементи керування (віджети) створюють викликом конструктора відповідного класу.
Першим у переліку аргументів-властивостей (зазвичай без назви, але можна використовувати назву master) вказують батьківський віджет, в який буде упаковано (поміщено) створюваний віджет. Батьківський віджет можна не вказувати. У такому випадку буде використано головне вікно програми.
Далі задають значення властивостей-аргументи:
тощо. Розглянемо приклад коду з використанням конструктора Button для кнопок button1 і button2:
from tkinter import * def button_clicked (): print("Клац!") root = Tk () # Кнопка як усталено button1 = Button() # створення кнопки button1 button1.pack() # розташування кнопки button1 на головному вікні # Кнопка із зазначенням батьківського віджета й кількома аргументами button2 = Button (root, bg = "red", text = "Натисни мене!", command = button_clicked) # створення кнопки button2 button2.pack () # розташування кнопки button2 на головному вікні root.mainloop ()
Після трьох клацань отримаємо таке:
4. Назви кольорів
Однією з властивостей елемента керування є bg — колір тла. Подану далі таблицю з назвами кольорів отримано з використанням коду, запозиченого зі сторінки сайту Smith College.
configure (синонім config) — для зміни конфігурації віджета під час виконання програми. Альтернатива:
назва_віджета[ 'назва властивості'] = нове_значення
Приклад виведення поточного часу після клацання по кнопці:
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 — обернений до методу configure і призначений для отримання даних про конфігурацію віджета.
from tkinter import * root = Tk() w = Label(root, text="Проба пера") w.pack() print(w.cget('text')) root.mainloop()
Як і у випадку з configure, є альтернатива:
назва_змінної = назва_віджета['назва_властивості']
destroy — знищення віджета і всіх його нащадків. Якщо потрібно лише на час заховати будь-якої віджет, то краще використати пакувальник grid і метод grid_remove. Наприклад, таким чином:
from tkinter import * def hide_show (): if label.winfo_viewable (): label.grid_remove () else: label.grid () root = Tk () label = Label (text='Я тут! ') label.grid () button = Button (command = hide_show, text = "Сховати / показати") button.grid () root.mainloop ()
grab_* — керуванням потоком події. Віджет, який захопив потік, буде отримувати всі події вікна або програми:
grab_set — передати потік даному віджету;
grab_set_global — передати глобальний потік даному віджету. В цьому випадку всі події (на моніторі) буде передано лише цьому віджету, а інші віджети всіх застосунків не отримуватимуть повідомлення про події;
grab_release — звільнити потік;
grab_status — дізнатися поточний статус потоку подій для віджета (можливі значення: None, "local" або "global");
grab_current — отримати віджет, який отримує потік;
Див. приклад захоплення глобального потоку й вивільнення його за 10 секунд. Протягом цих десяти секунд, наприклад, неможливо буде змінити розміри вікон програм.
from tkinter import * root = Tk () root.after (200, root.grab_set_global) root.after (10000, root.grab_release) root.mainloop ()
Проявом роботи цієї програми буде також поява вікна, яке створює мінімальна програма.
focus_* — керування фокусом введення з клавіатури. Віджет, який має фокус, отримує всі події з клавіатури:
focus (синонім focus_set) — передавання фокусу віджету;
focus_force — перевання фокусу, навіть якщо застосунок не має фокусу;
focus_get — повернення віджету, на який спрямовано фокус, або None, якщо такого немає;
focus_displayof — повернення віджету, на який спрямовано фокус на тому дисплеї, на якому розташовано віджет, або None, якщо такого немає;
focus_lastfor — повернення віджету, на який буде спрямовано фокус, коли вікно з цим віджетом отримає фокус;
tk_focusNext — повернення віджету, який отримає фокус наступним (зазвичай зміна фокуса відбувається при натисканні клавіші Tab). Порядок проходження визначено послідовністю пакування віджетів;
tk_focusPrev — повернення віджету, який мав фокус до поточного стану;
tk_focusFollowsMouse — надання віджету властивості отримувати фокус при наведенні на нього миші. При цьому повернути нормальну поведінку досить складно.
6. «Системні» (не віджет-специфічні) методи
Наступні методи впливають на роботу інтерпретатора tcl/tk.
Tаймери — за допомогою цих методів можна відкласти виконання якого-небудь коду на певний час:
after — має два аргументи: час у мілісекундах і функцію, яку потрібно виконати через вказаний час. Повертає ідентифікатор, який можна використати у методі after_cancel (див. далі);
after_idle — має лише один аргумент — функцію, яку буде виконано після завершення всіх відкладених операцій (тобто після того, як будуть опрацьовані всі події), повертає ідентифікатор, який може бути використаний в after_cancel;
after_cancel — має лише один аргумент — ідентифікатор завдання, отриманий попередніми функціями. Скасовує це завдання.
Див. приклад (годинник):
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_idletasks виконує завдання, відкладені «на потім» — на час, коли застосунок буде простоювати. Як правило цю функцію використовують при внесенні змін у стан застосунку і є потреба негайного відображення на екрані цих змін без очікування завершення сценарію;
update опрацьовує всі завдання, які стоять у черзі. Як правило її використовують під час «важких» розрахунків, коли необхідно залишити програму чутливою до дій користувача. Див. приклад.
from tkinter import * import math def hard_job (): x = 1000 while True: x = math.log (x) ** 2.8 root.update () root = Tk () button = Button () button.pack () root.after (500, hard_job) root.mainloop ()
Функції для виконання коду мовою tcl:
Аргументи цих функцій — відповідно рядок (з вказівками) чи шлях до файлу.
Toplevel — вікно верхнього рівня, яке використовують для створення багатовіконних програм, а також вікон діалогу. Має такі методи (їх можна застосувати також і до кореневого вікна root):
title — заголовок вікна;
overrideredirect — вказівка менеджеру вікон ігнорувати це вікно. Аргументом є True або False. Якщо аргумент не вказано, буде отримано поточне значення. Якщо аргумент має значення True, то таке вікно буде показано без обрамлення, тобто без заголовка і бордюру;
iconify / deiconify — згорнути / розгорнути вікно;
withdraw — «заховати» (зробити невидимим) вікно. Для того, щоб знову показати вікно, потрібно використовувати метод deiconify;
minsize і maxsize — мінімальний / максимальний розмір вікна. Методи мають два аргументи: ширина й висота вікна. Якщо не вказано жодних аргументів, методи повертають поточне значення;
state — отримати поточне значення стану вікна. Може повертати такі значення: normal (нормальний стан), icon (показано у вигляді іконки), iconic (згорнуто), withdrawn (не показано), zoomed (розгорнуто на повний екран — лише для Windows і Mac OS X);
resizable — вказівка на те, чи може користувач змінювати розмір вікна. Має два аргументи — можливість зміни розміру по горизонталі і по вертикалі. Без аргументів повертає поточне значення;
geometry — встановлює геометрію вікна у форматі ширина×висота + x + y. Наприклад,
geometry ("600x400 + 40 + 80")
означає таке: помістити вікно у точку з координатами (40,80) і встановити розмір 600×400). Розмір або координати можна не вказувати:
transient — зробити вікно залежним від іншого вікна, зазначеного в аргументі: буде згортатися разом із зазначеним вікном. Без аргументів повертає поточне значення;
protocol — отримує два аргументи: назву події та функцію, яка буде викликатися при настанні вказаної події. Події можуть мати такі назви:
tkraise (синонім lift) / lower — піднімає (розміщує поверх всіх інших вікон) / опускає вікно. Методи можуть приймати один необов'язковий аргумент: назву вікна, над / під яким потрібно розмістити поточне;
grab_set — встановлює фокус на вікно, навіть при наявності відкритих інших вікон;
grab_release — знімає монопольне володіння фокусом введення з вікна.
Приклад:
from tkinter import * def w_d (): print('Вікно закрито') root.quit () # вихід з програми root = Tk () root.title ('Приклад застосування') root.geometry('350x100+300+450') # ширина = 350, # висота = 100, # x = 300, # y = 450 root.protocol('WM_DELETE_WINDOW',w_d) # обробник закриття вікна root.resizable (False,True) # розмір можна змінити лише по вертикалі root.mainloop ()
Button — кнопка, яку розглянемо на прикладі дії коду:
from tkinter import * root = Tk () button1 = Button (root, text='Текст', width=10, height=3, bg='blue', fg='yellow', font='ubuntu 24') button1.pack () root.mainloop ()
Розберемо цей код. За створення вікна, відповідає клас Tk. У першу чергу потрібно створити екземпляр цього класу. Зазвичай його називають root, хоча його можна назвати як завгодно. Далі створено кнопку з вказанням її властивості:
Далі кнопку розташовано на вікні з допомогою найпростішого пакувальника (методу) pack (про пакувальники pack, place і grid див. далі). В кінці програми використано метод mainloop — цикл опрацювання подій.
Label — напис без можливості редагування його користувачем. Має ті самі властивості, що і перераховані вище властивості кнопки.
Entry — це елемент керування для введення одного рядок тексту. Має додаткові (порівняно з Button і Label) такі властивості:
Text — це елемент керування для введення довільного багаторядкового тексту. Має (додаткову) властивість wrap, що відповідає за перенесення. Щоб переносити словами, потрібно надати їй значення WORD — див. приклад без ознак кінця рядка (при його введенні не натискали на клавішу Enter).
from tkinter import * root = Tk () text1 = Text (root, height=7, width=7, font='ubuntu 14', wrap=WORD, bd=5) 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 — список, з елементів якого користувач може вибирати один або кілька пунктів. Має (додаткову) властивість selectmode, що може набувати таких значень:
Приклад застосування із заповненням списку:
from tkinter import * root = Tk () listbox1 = Listbox (root, height=3, width=15, selectmode = EXTENDED) listbox2 = Listbox (root, height=5, width=15, selectmode = SINGLE) list1 = ["Київ","Харків","Одеса","Львів"] list2 = ["Галич","Збараж","Теребовля","Тернопіль"] for i in list1: listbox1.insert (END, i) for i in list2: listbox2.insert (END, i) listbox1.pack () listbox2.pack () root.mainloop ()
Frame — рамка для організації віджетів всередині вікна, використання якої розглянемо на такому прикладі:
from tkinter import * root = Tk () frame1 = Frame (root, bg = 'green', bd = 5) frame2 = Frame (root, bg = 'red', bd = 5) button1 = Button (frame1, text = 'Кнопка 1') button2 = Button (frame2, text = 'Кнопка 2') frame1.pack () frame2.pack () button1.pack () button2.pack () root.mainloop ()
Checkbutton — елемент списку з місцем для мітки. Значення кожної мітки (прапорця) пов'язано зі своєю змінною. Значення цієї змінної властивістю onvalue (ввімкнено) і offvalue (вимкнено). При використанні кількох елементів списку потрібно для кожного використати свою змінну — див. приклад:
from tkinter import * root = Tk () var1 = IntVar () var2 = IntVar () check1 = Checkbutton (root, text = '1 пункт ', variable = var1, onvalue = 1, offvalue = 0) check2 = Checkbutton (root, text = '2 пункт ', variable = var2, onvalue = 0, offvalue = 1) check1.pack () check2.pack () root.mainloop ()
Radiobutton — перемикач — елемент списку з місцем для мітки за умови можливості виставити лише одну мітку. Перемикач завжди використовують у групі, причому увімкненим може бути лише один перемикач. Реалізація цього віджета відрізняється від реалізації для Checkbutton:
from tkinter import * root = Tk () v = IntVar () rbutton1 = Radiobutton (root, text='Варіант 1', variable=v, value=1) rbutton2 = Radiobutton (root, text='Варіант 2', variable=v, value=2) rbutton3 = Radiobutton (root, text='Варіант 3', variable=v, value=3) rbutton1.pack () rbutton2.pack () rbutton3.pack () root.mainloop ()
Тут:
IntVar — клас для роботи с цілими числами;
variable — властивість, що описує прикріплення до віджета змінної;
onvalue, offvalue — властивості, які надають прикріпленій до віджету змінній значение залежно від стану:
У цьому прикладі використано лише одну змінну. Залежно від того, який пункт обрано, вона змінює своє значення. Найцікавіше, що якщо надати цій змінній якесь значення, то зміниться і сам віджет.
Scale — шкала для вибору довільного значення із заданого діапазону. Має такі властивості:
див. приклад використання:
from tkinter import * root = Tk() def getV(root): a = scale1.get() print ("Отримане значення :", a) scale1 = Scale(root,orient=HORIZONTAL,length=300,from_=50,to=80,tickinterval=5,resolution=1) button1 = Button(root,text="Отримати значення") scale1.pack() button1.pack() button1.bind("<Button-1>",getV) root.mainloop()
Scrollbar — «прокручування» іншого віджету, наприклад, текстового поля. При використанні необхідно зробити дві прив'язки властивостей:
command смуги прокрутки — до методу xview / yview віджета;
xscrollcommand / yscrollcommand віджета — до методу set смуги прокрутки
— див. приклад:
from tkinter import * root = Tk () text = Text (root, height = 3, width = 20) text.pack (side = 'left') scrollbar = Scrollbar (root) scrollbar.pack (side = 'left') scrollbar ['command'] = text.yview # Прив'язування 1 text ['yscrollcommand'] = scrollbar.set # Прив'язування 2 root.mainloop ()
8. Canvas — виведення зображень на полотно
Canvas (полотно) — це об'єкт класу ТCanvas для виведення зображень, які можна змінювати і переміщати у процесі виконання програми.
На полотні можна розташувати такі об'єкти (у дужках вказано назви властивостей для полегшення пошуку довідкової інформації):
arc — дуга (activedash, activefill, activeoutline, activeoutlinestipple, activestipple, activewidth, dash, dashoffset, disableddash, disabledfill, disabledoutline, disabledoutlinestipple, disabledstipple, disabledwidth, extent, fill, offset, outline, outlineoffset, outlinestipple, start, state, stipple, style, tag, tags, width);
bitmap — двоколірне зображення (activebackground, activebitmap, activeforeground, anchor, background, bitmap, disabledbackground, disabledbitmap, disabledforeground, foreground, state, tags);
image — багатоколірне зображення (activeimage, anchor, disabledimage, image, state, tags);
line — відрізок прямої (activedash, activefill, activestipple, activewidth, arrow, arrowshape, capstyle, dash, dashoffset, disableddash, disabledfill, disabledstipple, disabledwidth, fill, joinstyle, offset, smooth, splinesteps, state, stipple, tags, width);
oval — коло або еліпс (activedash, activefill, activeoutline, activeoutlinestipple, activestipple, activewidth, dash, dashoffset, disableddash, disabledfill, disabledoutline, disabledoutlinestipple, disabledstipple, disabledwidth, fill, offset, outline, outlineoffset, outlinestipple, state, stipple, tags, width);
polygon — многокутник (activedash, activefill, activeoutline, activeoutlinestipple, activestipple, activewidth, dash, dashoffset, disableddash, disabledfill, disabledoutline, disabledoutlinestipple, disabledstipple, disabledwidth, fill, joinstyle, offset, outline, outlineoffset, outlinestipple, points, smooth, splinesteps, state, stipple, tags, width);
rectangle — прямокутник (activedash, activefill, activeoutline, activeoutlinestipple, activestipple, activewidth, dash, dashoffset, disableddash, disabledfill, disabledoutline, disabledoutlinestipple, disabledstipple, disabledwidth, fill, offset, outline, outlineoffset, outlinestipple, state, stipple, tags, width);
text — текст (activefill, activestipple, anchor, disabledfill, disabledstipple, fill, font, justify, offset, state, stipple, tags, text, width);
window — вікно (anchor, height, state, tags, width, window);
Подамо приклади (щоб побачити програму, потрібно клацнути на малюнку лівою кнопкою миші):
При створенні зображень прямокутників (дуг) перші дві пари аргументів є екранними координатами протилежних вершин прямокутника (прямокутника, описаного навколо еліпса).
Для успішного виконання програми з останнього прикладу необхідно, щоб тека з програмою містила файл зображення 55.png.
Властивість anchor використовують для того, щоб вказати, чим є точка з вказаними координатами для створюваного об'єктами:
Всі подані вище приклади (для скорочення коду) подано без використання ідентифікаторів чи тегів, які буде використано у прикладах, поданих нижче.
Метод focus_set використовують для фокусування уваги на полотні, щоб мати можливість прив'язати події до виконання методів полотна.
Метод create_* використовують для створення об'єкта, де замість * пишуть тип об'єкта, вказуючи у дужках спочатку обов'язкові значення властивостей-координат, а потім — решти властивостей
Щоб зрозуміти написане, див. приклад, у якому круг жовтого кольору зсувають на 2 пікселі, натискаючи на клавіатурі відповідні клавіші зі стрілками. У цьому прикладі звертення до об'єкту (круга) здійснено через ідентифікатор (ball).
Метод coords встановлює значення координат. Якщо вказано лише ідентифікатор або тег, то метод повертає поточні значення координат.
Метод itemconfig встановлює значення властивостей, що не є координатами.
Щоб краще зрозуміти написане, див. приклад, у якому при отриманні фокусу (натискати клавішу Tab) буде змінено розмір і колір квадрата.
Метод tag_bind надає можливість прив'язати опрацювання події до певної фігури на полотні, заданої ідентифікатором або тегом.
Метод delete видаляє об'єкт. Якщо потрібно озвільнити все полотно, то замість ідентифікаторів або тегів використовують сталу ALL
— див. приклад, де перетворення зображення на текст спричинено натисканням лівої кнопки миші.
Наступний приклад показує, як можна відобразити прямолінійний рівномірний рух об'єкта.
Метод find_overlapping повертає назви усіх об'єктів, що мають непорожній перетин з прямокутником, заданим координатами протилежних вершинних. Наприклад, така програма:
from tkinter import * root = Tk() c = Canvas(root, width=105, height=45, bg='white') c.pack() c11=c.create_rectangle(( 5, 5), (20, 20)) c12=c.create_rectangle((25, 5), (40, 20)) c13=c.create_rectangle((45, 5), (60, 20)) c14=c.create_rectangle((65, 5), (80, 20), fill="green", tag="c14" ) c15=c.create_rectangle((85, 5),(100, 20), fill="green") c21=c.create_rectangle(( 5,25), (20, 40)) c22=c.create_rectangle((25,25), (40, 40)) c23=c.create_rectangle((45,25), (60, 40)) c24=c.create_rectangle((65,25), (80, 40), fill="green") c25=c.create_rectangle((85,25),(100, 40), fill="green") c00=c.create_rectangle((73,15), (93, 30), fill="yellow") print(c11, c12, c13, c14, c15) print(c21, c22, c23, c24, c25) print(c00) t=c.find_overlapping(73,15,93,30) print(t); root.mainloop()
створює таке вікно:
і має таке консольне виведення:
1 2 3 4 5 6 7 8 9 10 11 (4, 5, 9, 10, 11)
У цьому прикладі 5 зафарбованих прямокутників (4, 5, 9, 10, 11) мають точки, що належать до жовтого прямокутника (11).
9. Розташування елементів за допомогою пакувальників
Пакувальник (менеджер геометрії, менеджер розташування) — механізм розташування (пакування) елементів керування (віджетів) на вікні.
У бібліотеці tkinter є три пакувальники: pack, place, grid. Зауважте: в одному віджеті можна використовувати лише один тип пакування. При змішуванні різних типів пакування програма, швидше за все, не буде працювати. Розглянемо кожен з них окремо.
pack — самий інтелектуальний (і непередбачуваний) з наявних пакувальників. При використанні цього пакувальника за допомогою властивості side потрібно вказати: до якої сторони батьківського віджета він має примикати. Як правило цей пакувальник використовують для розташування віджетів один за одним (зліва направо або зверху донизу) — див. приклад:
from tkinter import * root = Tk () button1 = Button (text = "1") button2 = Button (text = "2") button3 = Button (text = "3") button4 = Button (text = "4") button5 = Button (text = "5") button1.pack (side = 'left') button2.pack (side = 'top') button3.pack (side = 'left') button4.pack (side = 'bottom') button5.pack (side = 'right') root.mainloop ()
Для створення складної структури з використанням цього пакувальника зазвичай використовують віджети Frame, вкладені один в один.
Аргументи pack:
side ("left" / "right" / "top" / "bottom") — до якої сторони має примикати віджет;
fill (None / "x" / "y" / "both") — чи розширювати простір, що надають віджету;
expand (True / False) — чи розширювати сам віджет, щоб він зайняв весь наданий йому простір;
in_ — явна вказівка на те, в якій батьківський віджет потрібно вкласти даний віджет.
Додаткові методи віджетів для роботи з пакувальником pack:
pack_slaves (синонім slaves) — повертає список всіх дочірніх запакованих віджетів;
pack_info — повертає інформацію про конфігурацію пакування;
pack_propagate (синонім propagate) (True / False) — включає / відключає поширення інформації про геометрію дочірніх віджетів. Як усталено віджет змінює свій розмір відповідно до розміру своїх нащадків. Цей метод може відключити таку поведінку — pack_propagate(False). Це може бути корисно, якщо необхідно, щоб віджет мав фіксований розмір і не змінював його за примхою нащадків;
pack_forget (синонім forget) — видаляє віджет і всю інформацію про його розташування з пакувальника. Пізніше цей віджет може бути знову розміщений.
grid — розташовує віджет у комірку прямокутної таблиці.
Аргументи grid:
row — номер рядка, в який буде вкладено віджет;
rowspan — кількість рядків, які займає віджет (для того випадку, коли висоти одного рядка не вистачає);
column — номер стовпчика, в який буде вкладено віджет;
columnspan — кількість стовпчиків, які займає віджет (для того випадку, коли ширини одного стовпчика не вистачає);
padx / pady — розмір зовнішньої межі (бордюру) по горизонталі / вертикалі;
ipadx / ipady — розмір внутрішньої межі (бордюру) по горизонталі і вертикалі. Різниця між pad і ipad у тому, що при вказівці pad розширюється вільний простір, а при ipad розширюється віджет;
in_ — явна вказівка на те, в якій батьківський віджет потрібно розташувати даний віджет.
Приклади використання:
entry1.grid (row = 0, column = 0, columnspan = 3) button1.grid (row = 1, column = 0) button2.grid (row = 1, column = 1) button3.grid (row = 1, column = 2)
Додаткові методи віджетів для роботи з пакувальником grid:
grid_slaves (синонім slaves) — повертає список всіх дочірніх запакованих віджетів;
grid_info — повертає інформацію про конфігурацію пакування;
grid_propagate (синонім propagate) — (True / False) — включає / відключає поширення інформації про геометрію дочірніх віджетів. Як усталено віджет змінює свій розмір відповідно до розміру своїх нащадків. Цей метод може відключити таку поведінку — pack_propagate(False). Це може бути корисно, якщо необхідно, щоб віджет мав фіксований розмір і не змінював його за примхою нащадків;
grid_forget (синонім forget) — видаляє віджет і всю інформацію про його розташування з пакувальника. Пізніше цей віджет може бути знову розміщений.
grid_remove — видаляє віджет з-під керування пакувальником, але зберігає інформацію про пакування. Цей метод зручно використовувати для тимчасового видалення віджета.
grid_bbox (синонім bbox) — повертає координати (у пікселях) зазначених стовпців і рядків.
grid_location (синонім location) — приймає два аргументи-координати: x і y (у пікселях). Повертає номер рядка і стовпця, в які потрапляє точка із зазначеними координатами, або -1, якщо точка поза віджетом.
grid_size (синонім size) — повертає розмір таблиці в рядках і стовпцях.
grid_columnconfigure (синонім columnconfigure) / grid_rowconfigure (синонім rowconfigure) — функції для конфігурування пакувальника. Методи приймають номер рядка / стовпчика і аргументи конфігурації. Список можливих аргументів такий:
minsize — мінімальна ширина / висота рядка / стовпчика;
weight — «вага» рядка / стовпчика при збільшенні розміру віджета. 0 означає, що рядок / стовпчик не буде розширено. Рядок / стовпчик з "вагою" k буде розширено у k разів швидше, ніж з вагою 1;
uniform — об'єднання рядків / стовпчиків у групи. Рядки / стовпчики, що мають однаковий параметр uniform, буде розширено строго у відповідності зі своїм вагою;
pad — розмір межі (бордюру) — вказує на те, скільки простору буде додано до найбільшого віджету в рядку / стовпчику.
Приклад — текстовий віджет з двома смугами прокрутки:
from tkinter import * root = Tk () text = Text (wrap = NONE) vscrollbar = Scrollbar (orient = 'vert', command = text.yview) text [ 'yscrollcommand'] = vscrollbar.set hscrollbar = Scrollbar (orient = 'hor', command = text.xview) text [ 'xscrollcommand'] = hscrollbar.set # Розташовуємо віджети text.grid (row = 0, column = 0, sticky = 'nsew') vscrollbar.grid (row = 0, column = 1, sticky = 'ns') hscrollbar.grid (row = 1, column = 0, sticky = 'ew') # Конфігуруємо пакувальник, щоб текстовий віджет розширювався root.rowconfigure (0, weight = 1) root.columnconfigure (0, weight = 1) root.mainloop ()
place — розміщує віджет у фіксованому місці з фіксованим розміром. Також дозволяє вказувати координати розташування у відносних одиницях для реалізації «гумового» розміщення. При використанні цього пакувальника необхідно вказувати координати кожного віджета.
Аргументи place
anchor (зі значеннями "n", "s", "e", "w", "ne", "nw", "se", "sw" або "center") — вказівка на те, який кут або яку сторону віджета буде вказано в аргументах x, y, relx, rely. Як усталено "nw" — лівий верхній кут;
bordermode (зі значеннями "inside", "outside", "ignore") — визначає, в якій мірі буде враховано межі при розміщенні віджета;
in_ — явна вказівка на те, в який батьківський віджет буде вкладено даний;
x і y — абсолютні координати (у пікселях) розташування віджету;
width і height — абсолютні ширина і висота віджету;
relx і rely — відносні координати (від 0.0 до 1.0) розташування віджета;
relwidth і relheight — відносні ширина і висота віджету.
Додаткові методи віджетів для роботи з пакувальником place:
place_slaves, place_forget, place_info — див. опис аналогічних методів пакувальника pack.
10. Опрацювання подій
Властивість command віджетів Button, Checkbutton, Radiobutton, Spinbox, Scrollbar, Scale можна прив'язати до події. Вище вже було використано цей спосіб у прикладі з натисканням лівої кнопки миші на зображенні кнопки
button2 = Button (root, bg="red", text="Натисни мене!", command=button_clicked)
Такий спосіб вважають найкращим і найзручнішим способом прив'язування до події.
bind — метод пов'язування елемента керування, події і функції (обробника події) такою вказівкою:
назва_віджета.bind(назва_події, назва_функції)
Третім необов'язковим аргументом методу bind може бути рядок "+", якщо прив'язування додають до вже наявних. Інакше (якщо цей третій аргумент опущено або він є порожнім рядком) прив'язування заміщає всі інші прив'язування даної події до віджету.
Метод bind повертає ідентифікатор прив'язування, який можна використати у методу unbind з протилежним призначенням відв'язування. Зауважте: якщо bind прив'язано до вікна верхнього рівня, то tkinter буде опрацьовувати події всіх віджетів цього вікна (див. bind_all нижче). Функція, яку буде викликано при настанні події, повинна приймати один аргумент. Це об'єкт класу Event, що має такі властивості (в дужках вказані події, для яких цю властивість встановлено):
serial — серійний номер події (всі події);
num — номер кнопки миші (ButtonPress, ButtonRelease);
focus — чи має вікно фокус (Enter, Leave);
height і width — ширина й висота вікна (Configure, Expose);
keycode — код натиснутої клавіші (KeyPress, KeyRelease);
state — стан події (для ButtonPress, ButtonRelease, Enter, KeyPress, КeyRelease, Leave, Motion — у вигляді числа, для Visibility — у вигляді рядка);
time — час настання події (всі події);
x і y — координати вказівника миші на віджеті;
x_root і y_root — координати вказівника миші на екрані (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion);
char — набраний на клавіатурі символ (KeyPress, KeyRelease);
send_event — див. документацію до X / Windows;
keysym — набраний на клавіатурі символ (KeyPress, KeyRelease);
keysym_num — код набраного на клавіатурі символу (KeyPress, KeyRelease);
type — тип події у вигляді числа (всі події);
widget — віджет, який отримав подія (всі події);
delta — зміна при обертанні колеса миші (MouseWheel).
Метод bind може повертати рядки "continue" і "break". Якщо функція повертає "continue" то tkinter продовжить опрацювання інших прив'язок події, якщо "break" — опрацювання цієї події буде припинено. Якщо метод нічого не повертає (якщо повернуто None), то опрацювання подій триває. Інакше кажучи, це еквівалентно поверненню "continue".
Форми назв подій
Символ_клавіатури. Приклад для події натискання клавіші клавіатури:
назва_віджету.bind("z", callback)
Метод (функцію) callback буде викликано кожного разу, коли буде натиснуто клавішу z.
<Modifier-modifier-type-detail>. Тут назву події записано в кутові дужки. Всередині є нуль або більше модифікаторів, тип події та додаткова інформація (номер натиснутої клавіші миші або символ клавіатури). Поля розділяються дефісом або пробілом — див. приклад прив'язування одночасного натискання клавіш Ctrl + Shift + q.
назва_віджету.bind ("<Control-Shift-KeyPress-q>", callback)
У цьому прикладі KeyPress можна прибрати. Можливі модифікатори такі — через тире вказано усталену назву відповідної клавіші, якщо вона відмінна від назви модифікатора:
<<Нова_назва_події>> Цей спосіб дозволяє прив'язувати віртуальні події, породжені самим застосунком. Назви таких подій записують у подвійних кутових дужках.
Приклади назв подій:
Приклад програми — дві різні подіїї зі своїми розробниками пов'язано з одним елементом керування:
from tkinter import * root=Tk() def leftclick(event): print ('Натисли ліву кнопку миші.') def rightclick(event): print('Натисли праву кнопку миші.') button1=Button(root, text='Натискайте!') button1.pack() button1.bind('<Button-1>', leftclick) button1.bind('<Button-3>', rightclick) root.mainloop()
Обробник події, який викликають за допомогою метода bind, має обов'язковий параметр, через який передають назву події. Зазвичай його записують як event, хоча він може мати іншу назву в описі обробника. Його обов'язково записують на першому місці в описі функції і другим в описі методу (див. приклад).
from tkinter import * root = Tk() class myButton: def __init__(self): # Конструктор self.b = Button(text='Натискайте!', width=9, height=1) self.b.bind('', self.change) self.b.pack() def change(self, event): # Метод опрацювання події натискання лівої кнопки миші self.b['fg'] = "green" self.b['activeforeground'] = "red" myButton() root.mainloop()
Передавання додаткового аргумента обробника функції у метод bind здійснюють за допомогою лямбда-функції — див. приклад коду з передаванням кольору напису.
from tkinter import * root = Tk() def f(e, c): l['fg'] = c l = Label(text="Натискайте кнопки миші!") l.bind('<Button-1>', lambda e, c="red": f(e, c)) # для лівої кнопки миші l.bind('<Button-3>', lambda e, c="green": f(e, c)) # для правої кнопки миші l.pack() root.mainloop()
Таким чином, один і той самий обробник подій використано для різних подій, але з різними значеннями параметра обробника. Інакше потрібно створювати окремий обробник для кожної події.
Цей спосіб можна застосувати і до властивості command, якщо така є в елемента керування. В останньому випадку параметр назви події (зазвичай event) зайвий, бо обробляють лише одну подію клацання лівою кнопкою миші.
Вбудовані події
Activate, Deactivate. Ці дві події буде надіслано до кожного підвікна вікна верхнього рівня, коли буде змінено його стан. Подію Activate буде надіслано при активуванні вікна. Аналогічно, подію Deactive буде надіслано, коли вікно стане неактивним.
ButtonPress, ButtonRelease, Motion. Події виникають відповідно при натисканні, відпусканні кнопки миші або переміщенні вказівника миші. Повідомлення про події, як правило, буде надіслано до вікна, що містить вказівник. При натиснутій кнопці миші вікно, що містить вказівник миші, автоматично отримує тимчасове захоплення вказівника. Повідомлення про ці події будуть надіслані й у це вікно, незалежно від того, яке вікно містить вказівник, поки всі кнопки не будуть відпущені.
Colormap. Подія виникає при зміні, встановленні чи деісталяції кольорової мапи.
Configure. Подію буде надіслано до вікна щойно буде змінено його розмір, розташування або ширину межі, а іноді — при зміні позиції у порядку набору.
Destroy. Про цю подію буде повідомлено вікно після дій щодо його знищення. При повідомленні віджет перебуватиме у напівмертвому стані: все ще існує, але більшість операцій з ним нездійснена.
Enter, Leave. Події виникають відповідно входженні у вікно і виході з нього вказівника миші.
Expose. Подія виникає, коли все вікно або його частину потрібно перемалювати. Зазвичай клієнтським застосункам не потрібно обробляти подію Expose, бо Tk опрацьовує їх внутрішньо.
FocusIn, FocusOut. Події виникають при зміні фокусу клавіатури. Повідомлення про FocusOut буде надіслано до вікна, що втрачає фокус, а про FocusIn — тому, що набуває.
Gravity, Reparent, Circulate. Повідомлення про події Gravity і Reparent, як правило, не доходять до застосунків Tk. Їх включено у цей список для повноти. Подія Circulate вказує на те, що вікно переміщено до верхньої або нижньої частини порядку накладення в результаті запиту протоколу XCirculateSubwindows. Порядок складування може змінитися з інших причин, які не породжують подію Circulate. Tk не використовує XCirculateSubwindows внутрішньо. Цей тип події включено лише для повноти опису. Немає надійного способу відстежувати зміни позиції вікна у порядку складування.
KeyPress, KeyRelease. Події виникають відповідно при натисканні й відпусканні клавіші. Повідомлення про них буде надіслано до вікна з фокусом на клавіатурі.
Map, Unmap. Події створюються щоразу, коли змінюється стан відображення вікна.
MapRequest, CirculateRequest, ResizeRequest, ConfigureRequest, Create. Про ці події, як правило, не повідомляють застосунки Tk. Їх включено у перелік для повноти, щоб дозволити писати менеджери вікон X11 в Tk. Про ці події повідомляють лише тоді, коли клієнт вибрав SubstructureRedirectMask, а ядро Tk не використовує цю маску.
MouseWheel. Подія виникає при прокручуванні коліщатка миші. Подію завжди буде спрямовано до вікна з фокусом. Після отримання події, можна використати заміну %D, щоб отримати поле delta для події з цілим числом, що описує рух коліщатка миші. Найменше значення, про яке система буде повідомляти, визначено ОС. Знак значення визначає, в якому напрямку прокручувати віджет: додатні значення — прокручування вгору, від'ємні — вниз.
Property. Подія виникає при зміні чи вилученні властивості (вікна). Повідомлення про цю подію, як правило, не доходить до Tk застосунків, бо їх опрацьовує ядро Tk.
Visibility. Подія виникає, коли вікно буде перекрито іншим вікном, розташованим над ним (у порядку складування). Поле стану %s описує (новий) стан.
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 — змінює порядок опрацювання прив'язок. Стандартний порядок такий:
Приклад зміни порядку опрацювання на зворотний:
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.
11. Зображення
Для роботи із зображеннями у бібліотеці Tkinter є два класи:
Приклад:
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='blue', foreground='yellow') button=Button(root, image=image) button.pack() root.mainloop()
PhotoImage дає можливість використовувати багатоколірне зображення. Клас має кілька (досить примітивних) методів для роботи з зображеннями. PhotoImage гарантовано розуміє формат GIF.
Аргументи конструктора класу PhotoImage:
12. Вікна діалогу
Пакет tkinter містить кілька модулів доступу до вікон діалогу. Ці модулі необхідно імпортувати окремо. У поданих нижче прикладах для messagebox (потрібно використовувати лише один із запропонованих способів) у коментарі з поясненно синтаксису виклику.
import tkinter.messagebox # tkinter.messagebox.askyesno() from tkinter.messagebox import * # askyesno() from tkinter import messagebox # messagebox.askyesno() from tkinter import messagebox as my # замість my може бути довільна назва my.askyesno()
messagebox — модуль доступу до вікон діалогу з вибором одного з 2−3 варіантів («Так», «Ні», «Скасувати») або інформаційного вікна з повідомленням.
askyesno — стандартне вікно діалогу модуля messagebox для вибору одного з 2 варіантів: «Yes» або «No» («Так» або «Ні») — див. приклад.
from tkinter import * from tkinter.messagebox import * def f(): if (askyesno (title="Запит", message="Перенести дані?")): l['text'] = e.get() e.delete(0, END) root = Tk() e = Entry() l = Label() b = Button(text = 'Переписати', command = f) e.pack() b.pack() l.pack() root.mainloop()
Натискання кнопки з написом «Yes» (Так) вікна діалогу повертає у програму значення True, «No» (Ні) — False (як і закриття вікна). Таким чином можна опрацювати вибір користувача. В даному випадку при його згоді дані буде переписано з поля над кнопкою у напис під кнопкою.
Можна записати скорочено:
askyesno ("Запит","Перенести дані?")
Схожі породжують інші функції:
Зображення вище створено при ОС Linux Mint 18 Mate. Останні три функції повертають не значення True чи False, а відповідні рядки написів на кнопках.
Іншу групу модуля messagebox вікна складають інформаційні вікна лише з однією кнопкою, які слугують для виведення повідомлень. Це showerror, showinfo і showwarning — див. приклад.
from tkinter import * from tkinter.messagebox import * def f(): s = e.get() if s.isdigit(): e.delete(0, END) l['text'] = s else: showerror("Помилка","Потрібно ввести десятковий запис числа!") showinfo("Повідомлення","Потрібно ввести десятковий запис числа!") showwarning("Зауваження","Потрібно ввести десятковий запис числа!") root = Tk() e = Entry() l = Label() b = Button(text = 'Переписати', command = f) e.pack() b.pack() l.pack() root.mainloop()
filedialog — модуль, що містить такі функції:
Обидві функції повертають назву файлу, який потрібно відкрити або зберегти, але самі вони його не відкривають і не зберігають. Це роблять програмними засобами самого Python.
from tkinter import * from tkinter.filedialog import * def inText(): name = askopenfilename() if (str(name)!="()"): f = open(name) s = f.read() t.insert(1.0,s) f.close() def outText(): name = asksaveasfilename( filetypes = ( ("TXT files", "* .txt"), ("HTML files", "* .html; *. htm"), ( "All files", "*. *"))) if (str(name)!=""): f = open(name, 'w') s = t.get(1.0, END) f.write(s) f.close() root = Tk() t = Text(width = 30, height = 5) t.grid (columnspan = 2) b1 = Button(text = "Відкрити", command = inText) b2 = Button(text = "Зберегти", command = outText) b1.grid (row = 1, sticky = E) b2.grid (row = 1, column = 1, sticky = W) root.mainloop()
Примітка.
Перелік filetype містить назви типів файлів, які буде відкрито або збережено, та відповідні розширення. Останній малюнок ілюструє запис файла з назвою output.txt у теку /home/chief/.
При розміщенні текстового поля методом grid не вказано аргументи row і column. У таких випадках буде використано значення нуль.
Умовні оператори:
if (str(name)!="()"):
if (str(name)!=""):
використано для того, щоб уникнути зауважень (помилок) при натисканні клавіш з написом Cancel.
simpledialog — модуль, що містить такі функції:
— див приклад коду.
from tkinter import * from tkinter.simpledialog import * root = Tk() a = askstring("Введення даних", "Ваше ім'я?",parent=root) if (a!=None): print("Ваше ім'я ", a) else: print("Ви не знаєте свого імені?") a = askinteger("Введення даних", "Скільки Вам повних років?", parent=root, minvalue=0, maxvalue=125) if (a!=None): print("Ваш вік (у роках) ", a, ".") else: print("Ви не знаєте, скільки Вам років?") a = askfloat("Введення даних", "Який Ваш ріст у метрах?", parent=root, minvalue=0.0, maxvalue=2.5) if (a!=None): print("Ваш ріст ", a, " м.") else: print("Ви не знаєте, якого Ви зросту?")
У ході його виконання буде таке.
Виведено вікно діалогу для введення рядка.
Довільний непорожній рядок буде сприйнято і виведено як ім'я користувача, інакше буде виведено у консоль: "Ви не знаєте свого імені?".
Виведено вікно діалогу для введення цілого значення.
При введенні хибних значень буде виведено відповідні повідомлення.
Виведено вікно діалогу для введення запису десяткового дробу.
При введенні хибних значень буде виведено відповідні повідомлення.
colorchooser — модуль, що містить такі функцію askcolor, яка надає вікно діалогу для вибору кольору.
from tkinter import * from tkinter.colorchooser import * root = Tk() c = askcolor(parent=root,initialcolor=(255,255,255)) print(c)
Внаслідок здійсненого вибору можна отримати таке виведення у консоль.
((100.390625, 150.5859375, 200.78125), '#6496c8')
13. Розширення ttk
ttk (themed tk) — розширення tcl/tk з новим набором віджетів, підтримкою тем і стилів оформлення. Тому віджети ttk виглядають природніше в різних операційних системах. Починаючи з версій python 2.7 і 3.1.2 tkinter містить модуль для роботи з ttk.
ttk містить віджети, які можна використати замість відповідних віджетів tk: Button, Checkbutton, Entry, Frame, Label, LabelFrame, Menubutton, PanedWindow, Radiobutton, Scale і Scrollbar. Є кілька нових віджетів: Combobox, Notebook, Progressbar, Separator, Sizegrip и Treeview.
З точки зору програміста відмінність нових віджетів від старих полягає лише у тому, що віджетии ttk не мають опцій для конфігурування свого зовнішнього вигляду. Конфігурування зовнішнього вигляду віджетів ttk зійснюють через теми і стилі.
ttk має 4 вбудовані теми: default, classic, alt, clam. Додатково под Windows є теми winnative, xpnative i vista, а під Mac OS X — aqua.
Style — клас для работи зі стилями й темами. Саме цей клас потрібно використовувати для конфігурування зовнішнього вигляду віджетів ttk.
Основні методи класу Style
configure — конфігурування зовнішнього вигляду віджетів. Має аргументи: назву стиля віджета і список опцій конфігурування. Наприклад,
style.configure("TButton",padding=6,relief="flat",background="#ccc")
map — конфігурування зовнішнього вигляду віджетів залежно від їхніх станів (active, pressed, disabled тощо). Має аргументи: назву стилю віджета і список параметрів конфігурації. Приклад використання:
style.map ( "C.TButton", foreground = [( 'pressed', 'red'), ( 'active', 'blue')], background = [( 'pressed', '! disabled', 'black'), ( 'active', 'white')] )
lookup — повертає відповідну опцію конфігурації. Приклад використання:
style.lookup ( "TButton", "font")
layout — змінює схему (layout) віджета. Приклад використання:
style.layout ( "TMenubutton", [ ( "Menubutton.background", None), ( "Menubutton.button", { "children": [( "Menubutton.focus", { "children": [( "Menubutton.padding", { "children": [( "Menubutton.label", { "side": "left", "expand": 1})] })] })] }), ])
element_create — cтворює новий елемент теми.
element_names — повертає список елементів поточної теми.
element_options — повертає список параметрів конфігурації, зазначеного в аргументі елемента.
theme_create — cтворює нову тему, аргументи такі самі, що й у theme_settings (див. далі).
theme_settings — конфігурує наявну тему. Має аргументи — назва теми і словник, ключами якого є назви стилів (TButton тощо), а значеннями — схеми (layout) відповідного стилю.
theme_names — повертає список доступних тем.
theme_use — змінює поточну тему на зазначену в аргументі.
Віджет 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=["ОДИН","ДВА","ТРИ"], height=3) #frame - батьківський віджет, на його поверхні буде розташовано Combobox #values - набір значень, розташованих у Combobox спочатку #height - висота списку. Якщо кількість елементів списку менше 11, то її можна не задавати. # Якщо її не задано при кількості елементів, що перевищує 10, то праворуч буде смуга прокрутки. # Якщо у поданому прикладі задати значення height, яке менше трьох, то праворуч буде смуга прокрутки. # Але вона буде недоступна, а всі елементи буде відображено одночасно. combobox.set ("ОДИН") # Combobox встановлено на значення ОДИН спочатку combobox.grid (column = 0, row = 0) # Combobox розташовано на формі root.mainloop ()
Віджет Progressbar відображає рівень завантаження. Має аргументи:
Методи Progressbar:
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 ()
14. Приклад: примітивний текстовий редактор.
from tkinter import * from tkinter.filedialog import * from tkinter.messagebox import * import fileinput class Window_blank: def __init__(self): main_menu = Menu(root) root.config(menu=main_menu) first_menu = Menu(main_menu) main_menu.add_cascade(label="Файл", menu=first_menu) first_menu.add_command(label="Відкрити", command=self.open_file) first_menu.add_command(label="Зберегти як…", command=self.save_file) first_menu.add_command(label="Про програму", command=self.about) first_menu.add_command(label="Вихід", command=self.close_win) self.txt = Text(root, width=45, height=15) self.txt.pack() def open_file(self): op = askopenfilename() try: self.txt.delete(1.0, END) for i in fileinput.input(op): self.txt.insert(END, i) except: pass def save_file(self): save_as = asksaveasfilename() try: letter = self.txt.get(1.0, END) f = open(save_as, "w") f.write(letter) f.close() except: pass def close_win(self): if askyesno("Збереження файлу", "Зберегти дані?"): self.save_file() root.destroy() else: root.destroy() def about(self): showinfo("Примітивний редактор", "Це лише приклад застосування tkinter") root = Tk() root.title("Примітивний редактор") obj_menu = Window_blank() root.mainloop()
Роботу цього коду проілюструємо такими малюнками.