̲ͲÌÓÌ Ç TKINTER


 
  Àíîòàö³ÿ   Window   Frames   Events   Canvas

 
 
ÀÍÎÒÀÖ²ß
 
Óâàãà! ²íôîðìàö³ÿ íàäàíà íà ö³é ñòîð³íö³ íå º ÷åðãîâîþ ñïðîáîþ íàïèñàòè ùå îäèí ïîñ³áíèê ç Tkinter (³õ ³ òàê çàáàãàòî). Îñíîâíà ìåòà ñòîð³íêè öå íàäàòè ðÿä ïðèêëàä³â, ÿê³ ìîæóòü ïîëåãøèòè ñàìîñò³éíå îïàíóâàííÿ öüîãî ³íñòðóìåíòó. Òàêîæ òðåáà ï³äêðåñëèòè, ùî ïîäàíèé ìàòåð³àë îð³ºíòîâàí íà ïðèêëàäíèõ ïðîãðàì³ñò³â, òîìó â ïðèêëàäàõ âè íå çóñòð³íèòå åëåìåíò³â ÎÎÏ, òîáòî, îá'ºêòíî îð³ºíòîâàíîãî ïðîãðàìóâàííÿ.
 
 
Python GUI (Graphic user interface)

Python ìຠáåçë³÷ ôðåéìâîðê³â ç ãðàô³÷íèì ³íòåðôåéñîì, àëå Tkinter - ºäèíèé ôðåéìâîðê, âáóäîâàíèé ó ñòàíäàðòíó á³áë³îòåêó Python. Tkinter ìຠê³ëüêà ñèëüíèõ ñòîð³í. ³í êðîññïëàòôîðìåííèé, òîìó îäèí ³ òîé æå êîä ïðàöþº â Windows, macOS ³ Linux. ³çóàëüí³ åëåìåíòè â³çóàë³çóþòüñÿ ç âèêîðèñòàííÿì âëàñíèõ åëåìåíò³â îïåðàö³éíî¿ ñèñòåìè, òîìó ïðîãðàìè, ñòâîðåí³ çà äîïîìîãîþ Tkinter, âèãëÿäàþòü òàê, í³áè âîíè íàëåæàòü ïëàòôîðì³, äå âîíè âèêîíóþòüñÿ.

Íà ïåðøèé ïîãëÿä â ñêëàä³ á³áë³îòåê Tkinter íå òàê âæå áàãàòî â³äæåòîâ, òîáòî, ãðàô³íèõ åëåìåíò³â GUI äëÿ ðîçðîáêè ³íòåðôåéñ³â ó äîäàòêàõ. Àëå òðåáà çàóâàæèòè, ùî ïðàêòè÷íî äëÿ âñ³õ äîäàòê³â òåõí³÷íîãî ñïðÿìóâàííÿ, òàêèõ â³äæåò³â á³ëüø í³æ äîñòàòíüî.

Tkinter íàäຠâ³äæåòè ó äâîõ âàð³àíòàõ: â³äæåòè, ÿê³ ðîçì³ùóþòüñÿ áåçïîñåðåäíüî â ïàêåò³ tkinter, òà â³äæåòè ç ïàêåòó tkinter.ttk. Ç îäíîãî áîêó, îáèäâà ïàêåòè íàäàþòü ïðàêòè÷íî ò³ ñàì³ â³äæåòè, íàïðèêëàä, â³äæåò Button º â îáîõ ïàêåòàõ. Àëå ç ³íøîãî áîêó, ttk íàäຠòðîõè á³ëüøå ôóíêö³îíàëüíîñò³ íàëàøòóâàííÿ â³äæåò³â, çîêðåìà, ¿õ ñòèë³çàö³¿. ² ââàæàºòüñÿ, ùî â³äæåòè ç ttk äåùî ñó÷àñí³ø³, í³æ ñòàíäàðòí³, â òîé æå ÷àñ ç ttk, ìîæëèâî, òðîõè ñêëàäí³øå ïðàöþâàòè. Ùî âèêîðèñòîâóâàòè çàëèøàºòüñÿ íà âèá³ð ðîçðîáíèêà.

Íà ïî÷àòîê 2023 ðîêó íàéá³ëüø ñòàá³ëüíîþ ââàæàºòüñÿ âåñ³ÿ Python 3.7 ÿêà âêëþ÷ຠâ ñåáå Tkinter âåðñ³¿ Tcl/Tk 8.6, à ñàìå:

  • Tk - áàçîâèé ïàêåò â³äæåòîâ
  • ttk - äîäàòêîèé ïàêåò â³äæåòîâ, êîìàíä òà âëàñòèâîñòåé
  • Tcl - âáóäîâàíó á³áë³îòåêó êîìàíä (Tool Command Language)

Çàóâàæèìî, âñ³ ïðèêëàäè, ùî íàâåäåí³ íà ö³é ñòîð³íö³, âåð³ô³êîâàí³ ñàìå â âåðñ³¿ Python 3.7, òîáòî, Tkinter âåðñ³¿ Tcl/Tk 8.6. òà îïåðàö³éí³é ñèñòåì³ Windows 10

 

Ñüîãîä³ â ³íòåðíåò³ ìîæà çíàéòè äóæå áàãàòî ñòîð³íîê, ùî ïîñâÿ÷åí³ ñàìîñò³éíîìó îïàíóâàííþ Tkinter, àëå á³ëüøèñòü ç íèõ ìຠäóæå ñïðîùåíó àáî íåïîâíó ³íôîðìàö³þ. ϳñëÿ òðèâàëîãî ñåðô³íãó ïî òàêèì ñòîð³íêàì, íà ì³é ïîãëÿä, ìîæíà ðåêîìåíäóâàòè òàê³ ñòîð³íêè:

  • W3Schools
    Äëÿ ïî÷àòêó áàæàíî îçíàéîìèòèñÿ ñ äóæå çðó÷íèì äîâ³äíèêîì ç Python (òà íå ëèøå Python) â³ä W3Schools. Âçàãàë³ W3Schools öå ó÷áîâèé êóðñ, àëå ÿê äîâ³äíèê â³í äóæå çðó÷íèé. Çàóâàæèìî, ùî W3Schools ñïèðàºòüñÿ ëèøå íà îô³ö³éí³ ìîæëèâîñò³ çàñîá³â ïðîãðàìóâàííÿ, òîìó â íüîìó ìàðíî øóêàòè íåäîêóìåíòîâàíèõ ô³øåê. Òà ìàáóòü öå äîáðå, áî âñå ùî òàì íàâåäåíî áóäå ãàðàíòîâàíî ïðàöþâàòè.

  • TkDocs home
    Ðîçøèðåíèé ï³äðó÷íèê ç³ ñòâîðåííÿ ³íòåðôåéñ³â êîðèñòóâà÷à çà äîïîìîãîþ Tkinter Ïîÿñíþº êëþ÷îâ³ êîíöåïö³¿ òà ³ëþñòðóº ðåêîìåíäîâàí³ ï³äõîäè çà äîïîìîãîþ ñó÷àñíîãî API.

  • Äîâ³äíèê Tkinter 8.5: ãðàô³÷íèé ³íòåðôåéñ äëÿ Python
    Äîâ³äêîâà äîêóìåíòàö³ÿ äëÿ Tkinter 8.5 ³ç äåòàëüíèì îïèñîì äîñòóïíèõ êëàñ³â, ìåòîä³â ³ ïàðàìåòð³â. Ìîæå â ïîâíîìó îáñÿç³ âèêîðèñòîâóâàòèñÿ äëÿ âåðñ³¿ 8.6

  • Tk êîìàíäè
    Âè÷åðïíå ïîñèëàííÿ íà êîæíó ç áàçîâèõ êîìàíä Tcl/Tk, ùî âèêîðèñòîâóþòüñÿ â Tkinter.

  • Äîìàøíÿ ñòîð³íêà Tcl/Tk
    Äîäàòêîâà äîêóìåíòàö³ÿ òà ïîñèëàííÿ íà ðîçðîáêó ÿäðà Tcl/Tk.

Íà ñüîãîäí³ äîâ³äêîâà äîêóìåíòàö³ÿ äëÿ Tkinter 8.5 ³ç äåòàëüíèì îïèñîì äîñòóïíèõ êëàñ³â, ìåòîä³â ³ ïàðàìåòð³â (àòðèáóò³â), ùî ìîæå â ïîâíîìó îáñÿç³ âèêîðèñòîâóâàòèñÿ äëÿ âåðñ³¿ 8.6, º íàéá³ëüø ïîâíîþ äîêóìåíòàö³ºþ ïî ñèñòåì³ Tkinter. Ñàìå òîìó íèæ÷å ïðèâåäåíî ïîñèëàííÿ íà çàâàíòàæåííÿ öüîãî äîêóìåíòó ó pdf-ôîðìàò³:

 
 
 

  Äî ìåíþ ñòîð³íêè

 
 
Ðîçä³ë 1. ²ÊÍÀ TKINTER

³êíà Tkinter öå îñíîâí³ íîñ³¿ ãðàô³÷íîãî ³íòåðôåéñó êîðèñòóâà÷à. Âçàãàë³ á³ëüøèñòü äîäàòê³â çàñòîñîâóþòü ëèøå îäíî â³êíî ç òèïîâèì ³ì'ÿì root. Äëÿ ñòâîðåííÿ â³êíà äîñòàòíüî âèêîíàòè íàñòóïíèé êîä:

# ²ìïîðòóºìî âñå ùî ìຠtkinter
from tkinter import *
# Ñòâîðþºìî îá'ºêò â³êíà
root = Tk()
# ----------------------
# Îáëàñòü ðîçì³ùåííÿ â³äæåò³â òà ïðîãðàìíîãî êîäó
# ----------------------
# Îñòàííüîþ ³íñòðóêö³ºþ âèêëèêàºìî ìåòîä
# âçàºìî䳿 â³êíà ç êîðèñòóâà÷åì
root.mainloop()

Ïðèêëàäè
  • books.ico
    ²êîíêà (òèïîâèé ðîçì³ð 32õ32 ï³êñåë³ äëÿ ìàðêóâàííÿ â çàãîëîâêó â³êíà

  • win_01_simple.py
    Ïðèêëàä îôîðìëåííÿ çàãîëîâêà â³êíà, êîëüîðó òà ðîçì³ðó â³êíà

  • win_02_geometry.py
    Ïðèêëàä êåðóâàííÿ ãåîìåòðè÷íèìè ïàðàìåòðàìè â³êíà.
    Ïàðàìåòð resizable äîçâîëÿº àáî çàáîðîíÿº ðîçòÿãóâàòè â³êíî ïî X òà Y.
    Ïàðàìåòðè minsize òà maxsize ô³êñóþòü ì³í³ìàëüíèé òà ìàêñèìàëüíèé ðîçì³ðè â³êíà. Ôóòêö³¿ winfo_screenwidth() òà winfo_screenheight() äîçâîëÿþòü ä³çíàòèñÿ ïîòî÷íèé ðîçì³ð åêðàíó.

  • win_03_GetSize_01.py
    Öåé ïðèêëàä â³äïîâ³äຠíà ïèòàííÿ - ÿê ä³çíàòèñÿ ðîçì³ðè â³êà ó RunTime (òîáòî, ï³ä ÷àñ âèêîíàííÿ ïðîãðàìè). Öå ìîæëèâî çðîáèòè çàâäÿêè êîäó:

    root.update_idletasks() # Îíîâèìî äàí³ ãåîìåò𳿠â³êíà
    wStr = str(root.geometry()) # Ïðî÷èòàºìî ãåîìåòðèþ ÿê ñòðîêó
    wTxt = wStr.split("+") # Ðîçä³ëåìî ñòðîêó íà ñïèñîê ñòðîê

    Äàë³ ïåðøèé åëåìåíò ñïèñêó çàñòîñîâóºòüñÿ äëÿ â³äîáðàæåííÿ ãàáàðèò³â â³êíà

  • win_03_GetSize_02.py
    Ïðèêëàä ðîçøèðåíî¿ ðåàë³çàö³¿ ìîäóëÿ win_03_GetSize_01.

  • win_04_ReSize.py
    Ïðèêëàä çì³íè ãåîìåò𳿠â³êíà êîäîì ó RunTime. Çì³íà ðîçì³ðó âèêîíóºòüñÿ ìåòîäîì root.geometry(wStr) äî ÿêîãî ïîïåðåäíüî ôîðìóåòüñÿ ñòðîêà, íàïðèêëàä wStr='600x200'
 
 
  • win_05_close.py
     ö³ëîìó ðÿä³ äîäàòê³â äóæå âàæëèâî êîíòðîëþâàòè íåáàæàííå çàâåðøåííÿ äîäàòêó. Äëÿ öüîãî òðåáà â â³äïîâ³äíîìó â³êíó (ÿê ïàâèëî, root) äîäàòè ïðîñëóõîâóâàííÿ ñèñòåìíî¿ ïî䳿 çíèùåííÿ â³êíà òà ïðîöåäóðè îáðîáêè òàêî¿ ïî䳿, òîáòî, root.protocol("WM_DELETE_WINDOW", finish)
    Äàíèé ïðèêëàä ³ëþñòðóº ä³àëîã â ïðîöåäóð³ finish, ùî âèêîíóºòüñÿ ìåòîäàìè askyesno òà showinfo â³äæåòó messagebox äëÿ RunTime çàâåðøåííÿ äîäàòêó ìåòîäîì root.destroy()

  • win_06_alpha.py
    Ïðèêëàä âèïëèâàþ÷îãî ïîëóïðîçîðîãî â³êíà.
    Íåîáõ³äíî òàêîæ çàçíà÷èòè, ùî â³êíà ìàþòü äåê³ëüêà ö³êàâèõ àòðèáóò³â, â òîìó ÷èñë³ àòðèáóòè:

    • root.attributes("-fullscreen", True)
      âèêîíóº ïåðåõ³ä â³êíà â ïîâîåêàííèé ðåæèì (True) òà íàçàä (False)
    • root.attributes("-alpha", 0.5)
      çàäຠð³âåíü ïðîçîðîñò³ â³êíà (0.1 ... 1.0), 1.0 íå ïðîçîðî.
    • root.attributes("-toolwindow", True)
      äîçâîëÿº õîâàòè êíîïêè (True) ó çàãîëîâêó â³êíà, àáî ïîâåðòàòè ö³ êíîïêè (False). Àòðèáóò íå çì³íþº â³äîáðàæåííÿ êíîïêè 'x' òà â³äîáðàæåííÿ title

    Íàâåäåíèé ïðèêëàä ïðàêòè÷íî íå ñòîñóºòüñÿ òåõí³÷íèõ äîäàòê³â. Ñêîð³øå â³í ìຠ³ëþñòðàòèâíèé õàðàêòåð äî çàñòîñóâàííÿ àòðèáóò³â

  • win_06_alpha.pyw
    Ìîäóëü, ùî äîçâîëÿº çàïóñêàòè ³íø³ ìîäóë³ (â äàíîìó âèïàäêó win_06_alpha.py) òà ïðèõîâóº êîíñîëü, ÿêà ñóïðîâîäæóå ïðàöþþ÷è ìîäóë³ òèïó *.py. Çàñòîñîâóºòñÿ äëÿ çàïóñêó ãîòîâèõ äîäàòê³â.

  • win_07_two_win.py
    Ïðèêëàä ñòâîðåííÿ äîäàòêó ñ áàãîòüìà â³êíàìè. Äëÿ ñòâîðåííÿ äîäàòêîâîãî â³êíà çàñòîñîâóºòüñÿ ôóíêö³ÿ Toplevel, íàïðèêëàä win1 = Toplevel() Âñ³ ñòâîðåí³ â³êíà áóäóò ïðàöþâàòè â îäíîìó ïîòîêó, àëå ³ìåíà, ùî çàñòîñîâàí³ â òàêèõ â³êíàõ áóäóòü ³çîëüîâàí³, òîáòî, íåâ³äîì³ äëÿ ñóñ³äí³õ â³êîí.

   

 

Ðåêîìåíäàö³¿ äëÿ ïî÷àòê³âö³â

  Ðîçãëÿäàþ÷è êîäè ðîçä³ëó "³êíà Tkinter" âè ìàáóòü çâåðíóëè óâàãó, ÷òî çíà÷íà ÷àñòèíà êîäó ïðèä³ëÿåòüñÿ îôîðìëåííþ. Ç îäíîãî áîêó öå çðîçóì³ëî, áî ìè ðîçãëÿäàºìî Tkinter, à ç äðóãîãî áîêó, ìàºìî òðóäíîù³ ç ñïðèíÿòòÿì ôóíêö³îíàëüíîãî ñåíñó òàêîãî îôîðìëåííÿ. Îñîáëèâî öå ñòîñóºòüñÿ ïî÷èíàþ÷èõ âèâ÷àòè Python.

  Íàæàëü á³ëüøèñòü äæåðåë ³íôîðìàö³¿, ïðèñâÿ÷åíèõ Tkinter, ëèøå äîäàþòü òàêèõ òðóäíîù³â, áî çíàéòè â³äïîâ³äü íà êîíêðåòíå ïèòàííÿ â íèõ äîñèòü âàæêî. Ùå îäíà ïåðåøêîäà äëÿ ïî÷àòê³âö³â öå â³äñóòí³ñòü çðó÷íî¿ HELP-ñèñòåìè ç Tkinter (íà ïî÷àòîê 2023 ðîêó ÿ òàêî¿ ñèñòåìè íå çíàéøîâ). Òîìó ÷àñò³øå äîâîäèòüñÿ êîðèñò³âàòèñÿ ³íôîðìàö³ºþ ç ð³çíèõ ñàéò³â.

  Âèõîäÿ÷è ç ñêàçàíîãî, ïî÷àòê³âöÿì ìîæíà íàäàòè íàñòóïí³ ðåêîìåíäàö³¿:

  1. Çàñòîñîâóéòå â ñâî¿õ ïðîåêòàõ ïîñò³éíèé òà ì³í³ìàëüíèé ñêëàä â³äæåò³â. Äëÿ á³ëüøîñò³ òåõí³÷íèõ äîäàòê³â ç ïî÷àòêó äîñòàòíüî çàñòîñîâóâàòè ëèøå â³äæåòè Frame, Button, Label, Entry òà Text. Äàë³ öåé ñïèñîê ìîæíà ïîøèðèòè â³äæåòàìè ListBox, ComboBox, Checkbutton, Menu. Ùå äàë³ çàñòîñîâóâàòè â³äæåò Canvas. Çâè÷àéíî â³äæåò³â â Tkinter á³ëüøå í³æ âèùå íàâåäåíî. ßêùî öå äëÿ âàñ âàæëèâî, òî (íà äàíèé ÷àñ) ìîæíà çàïðîïàíóâàòè íàñòóïí³ ïîñèëàííÿ íà ïóò³âíèêè ïî â³äæåòàì Tkinter:

  2. Äåòàëüíî äîñë³äèòå çàñîáè ïîç³ö³îíóâàííÿ â³äæåò³â.  ïåðøó ÷åðãó öå ñòîñóºòüñÿ â³äæåò³â Frame, Button, Label, Entry. Ïîðÿäîê äîñë³äæåííÿ çàñîá³â ïîç³ö³îíóâàííÿ ðåêîìåíäóºòüñÿ íàñòóïíèé: Place, Grid, Pack
    Íàéá³ëüø ñêëàäíèì äëÿ îïàíóâàííÿ º Pack-ïîç³ö³îíóâàííÿ. Àëãîðèòì Pack íàìàãàºòüñÿ ðîçì³ñòèòè â³äæåò íàéá³ëüø êîìïàêòíèì çàñîáîì, ç óðàõóâàííÿì Pack-ïàðàìåòð³â îòî÷óþ÷èõ â³äæåò³â. Òîìó (äëÿ ïî÷àòê³âöÿ) íà ºòàï³ êîäóâàííÿ ìàéæå íåìîæëèâî âãàäàòè ÿê ðîçòàøóþòüñÿ â³äæåòè â RunTime.
    Íàâåäåìî êîﳿ (ç ðîñ³éñêîãî ñàéòó https://metanit.com/) îêðåìèõ ñòîð³íîê, ïðèñâÿ÷åíèõ ïîç³ö³îíóâàííþ:

  3. Ïî䳿 Êîæåí â³äæåò Tkinter ìຠçäàòí³ñòü îáèðàòè ÿê³ ïî䳿 áàæàíî ïðîñëóõîâóâàòè â îïåðàö³éí³é ñèñòåì³, òà äëÿ îáðàíèõ ïîä³é âèêîíóâàòè ñòâîðåí³ ïðîãðàìèñòîì ïðîöåäóðè îáðîáêè òàêèõ ïîä³é. Á³ëüø äåòàëüíî ïðî ïî䳿 áóäå íàäàíî ³íôîðìàö³þ íèæùå íà ö³é ñòîð³íö³.

 
  Äî ìåíþ ñòîð³íêè

 
 
Ðîçä³ë 2. FRAMEs (ÔÐÅÉÌÈ) TKINTER

  Ôðåéìè (Frames) öå íàñòóïíèé (ñë³äîì çà â³êíàìè) ð³âåíü ñòðóêòóð³çàö³¿ ãðàô³÷íîãî ³íòåðôåéñó êîðèñòóâà÷à. Ôðåéìè ìîæíà óìîâíî ðîçãëÿäàòè ÿê âáóäîâàí³ â ðåàëüíå â³êíî â³äæåòè-êîíòåéíåðè, ùî ïîä³áí³ äî â³êîí.

  Ôðåéìè çäàòí³ áóòè êîíòåéíåðàìè äëÿ ³íøèõ ôðåéì³â, òîáòî â îäíîìó ôðåéì³ ìîæíà ðîçì³ñòèòè íåîáõ³äíó ê³ëüê³ñòü äîäàòêîâèõ ôðåéì³â.

  ßê â³äæåòè, ôðåéìè òàêîæ íàëåæèòü ïàêóâàòè. Òîáòî, äî ôðåéìîâ íåîáõ³äíî çàñòîñîâóâàòè ïàêóâàëüíèêè place àáî pack àáî grid.

  Îêðåìî ìè íå ðîçãëÿäàëè ä³þ ïàêóâàëüíèê³â íà â³äæåòè, áî òàêà ä¿ÿ ìຠáåçë³÷ âàð³àíò³â, îñîáëèâî ç óðàõóâàííÿì ïàðàìåòð³â ïàêóâàëüíèê³â òà âïëèâ íà ïàêóâàííÿ îòî÷óþ÷èõ â³äæåò³â. ßê âèõ³ä ç òàêîãî ð³çíîìàí³òòÿ ìîæíà îáðàòè îêðåì³ âàð³àíòè òà â ïîäàëüøîìó çàñòîñîâóâàòè ¿õ ïîä³áíî øàáëîíàì.

  Ñàìå òàê³ ïðèêëàäè-øàáëîíè çàïðîïàíóºìî ³ äî ôðåéì³â. Äîäàòêîâî íàâåäåìî øâèäê³ ïîñèëàííÿ íà äîêóìåíòàö³þ. Çàóâàæèìî, ùî îêðåì³ ïàðàìåòðè â³äæåò³â ìàþòü ñâî¿ âëàñòí³ ïàðàìåòðè. Òîìó â äîêóìåíòàö³¿ ãîëîâí³ ïàðàìåòðè â³äæåòó ìàþòü íàçâó "àòðèáóòè". Òîáòî, ïàðàìåòðè àòðèáóòó öå éãî âëàñòí³ ïàðàìåòðè.

Frame ç ïàêóâàííÿì place òà grid
( ïàïêà 01_Frame_place_grid )
  • f01.py
    Äâà ôðåéìà â place óïàêîâö³, ùî ïðèçíà÷åí³ äëÿ íàäàííÿ çàãàëüíî¿ ³íôîðìàö³¿ ç ¿õ ïàðàìåòð³â.

  • f02_place.py
    ×îòèðè ôðåéìà â place óïàêîâö³, ùî ³ëþñòðóþòü â³ëüíå ðîçì³ùåííÿ â³äæåò³â â ãðàô³÷íîìó ³íòåðôåñ³ êîðèñòóâà÷à

  • f03_grid.py
    Øàáëîí ôðåéìà ç grid ïàêóâàííÿì ãðóïè ò³òóëüíèõ íàäïèñ³â òà â³äïîâ³äíèõ ¿ì êíîïîê. Îêðåìó óâàãó çâåðí³òü íà ïàðàìåòð command â ïðîöåäóð³ btnCreate(butNum)

  • f04_dialer.py
    Øàáëîí ôðåéìà â place óïàêîâö³ äëÿ grid - ãðóïè êíîïîê, ùî ïðèçíà÷åí³ äëÿ ôîðìóâàííÿ ÷èñåë.  äàíîìó ïðèêëàä³ öåé øàáëîí çàñòîñîâóºòüñÿ ÿê ÷àñòèíî íàáèðà÷à òåëåôîíîãî íîìåðó.

 
 

Frame ç ïàêóâàííÿì pack òà grid
( ïàïêà 02_Frame_pack_grid )
  • f01_pack_place.py
    Øàáëîí òðè ôðåéìà (îäèí ãîðèçîíòàëüíèé, äâà âåðòèêàëüíèõ). Ó ãîðèçîíòàëüíîìó òà ë³âîìó âåðòèêàëüíîìó ôðåéìàõ â³äæåòè ðîçì³ùåí³ ó ïàêóâàíí³ pack. Ó ïðàâîìó âåðòèêàëüíîìó ôðåéì³ â³äæåòè ðîçì³ùåí³ ó ïàêóâàíí³ place

  • f02_1h2v.py
    Øàáëîí òðè ôðåéìà (îäèí ãîðèçîíòàëüíèé, äâà âåðòèêàëüíèõ). Ó ïðàâîìó âåðòèêàëüíîìó ôðåéì³ ðîçì³ùåí³ ùå äâà ãîðèçîíòàëüíèõ ôðåéìà. ³äæåòè, ùî ðîçì³ùåí³ ó âñ³õ ôðåéñàõ ìàþòü ïàêóâàííÿ pack àáî grid

  • f03_1h2v.py
    Òåæ ñàìå ùî ³ f02_1h2v.py, àëå ç ³íøîþ åëàñòè÷í³ñòþ ôðåéì³â

  • f04_3h_text.py
    Øàáëîí òðè ãîðèçîíòàëüíèõ ôðåéìà. Ñåðåäí³é ôðåéì åëàñòè÷íèé ÿê ïî ãîðèçîíòàë³, òàê ³ ïî âåðòèêàë³. Çðó÷íî âèêîðèñòîâóâàòè â ðåòàêòîðàõ òåêñòó àáî ðåïîðòåðàõ.

  • f05_3h_menu.py
    Òåæ ñàìå ùî ³ f04_3h_text.py, àëå ç âáóäîâàíèì ãîëîâíèì ìåíþ

  • f06_3h_grid.py
    Øàáëîí òðè ãîðèçîíòàëüíèõ ôðåéìà. Ñåðåäí³é ôðåéì åëàñòè÷íèé, ÿê ïî ãîðèçîíòàë³, òàê ³ ïî âåðòèêàë³. Ó ñåðåäí³é ôðåéì âáóäîâàí³ çà àëãîðèòìîì "ñòð³÷êà" â³äæåòè â ïàêóâàíí³ grid.
Âêëàäêè ç ôðåéìàìè ttk.Notebook
  • pn01.py
    Ïðèêëàä äâîõ ïàíåëåé (âêëàäîê) ç âáóäîâàíèìè ôðåéìàìè, ùî ïåðåìèêàþòüñÿ çàâäÿêè çàãîëîâêàì

  • atributes01.py
    Ìàëèé äîâ³äíèê ç àêòóàëüíèõ àòðèáóò³â â ñêëàä³ ïîïóëÿðíèõ â³äæåò³â

   

 
  Äî ìåíþ ñòîð³íêè

 
 
Ðîçä³ë 3. EVENTs (ÏÎIJ¯) TKINTER

Ïî䳿, öå îñíîâíèé çàñ³á ³í³ö³þâàòè ñï³ëêóâàííÿ ïðîãðàì ÿê ïîì³æ ñîáîþ, òàê ³ ç ê³íöåâèì êîðèñòóâà÷åì. Çàçâè÷àé äæåðåëà ïîä³é óìîâíî ïîä³ëÿþòü íà àïàðàòí³ (ô³çè÷í³) òà ïðîãðàìí³, àëå (ç çàçíà÷åíîãî íèæ÷å) âñ³ ïî䳿 ìàáóòü ìîæíà ïîçíà÷èòè ÿê àïàðàòíî-ïðîãðàìí³ ïî䳿, àáî ïðîñòî ïî䳿.

Äî àïàðàòíèõ ïîä³é â³äíîñÿòü òàê³ ïî䳿, ùî ³í³ö³þþòü àáî âóçëè ìàòåðèíñüêî¿ ïëàòè (ïðîöåñîð, òàéìåð, êîíòðîëåðè â³äåîêàðò, HDD, êîíòðîëåðè ìåðåæåâîãî îáëàäíàííÿ, òà ³íø³ êîíòðîëåðè), àáî ïåðèôåð³éí³ âóçëè êîìï'þòåðà (êëàâ³àòóðà, ìèøêà, ïðèíòåð, ñêàíåð òà ³íø³). Äî äæåðåë ïðîãðàìíèõ ïîä³é â³äíîñÿòü ñïåö³àëüí³ êîìàíäè (³íñòðóêö³¿), ùî ìîæå çàñòîñîâóâàòè ïðîãðàì³ñò ïðè êîäóâàíí³ ïðîãðàìè.

Îïåðàö³éíà ñèñòåìà “ïðîñëóõîâóº” âñ³ çàçíà÷åí³ äæåðåëà àïàðàòíèõ ïîä³é, ÷àñòêîâî ïîä³é ïðîãðàìíèõ òà ðîçïî÷èíຠ¿õ ïðîãðàìíó îáðîáêó òà ìàðøðóòèçàö³þ äî ñèñòåìíèõ àáî ïðèêëàäíèõ ïðîãðàì. Ïðîãðàìí³ íàäáóäîâè ïðàêòè÷íî âñ³õ ñó÷àñíèõ ñèñòåì ïðîãðàìóâàííÿ ïîâ³äîìëÿþòü îïåðàö³éíó ñèñòåìó íà ÿê³ ³ç çàçíà÷åíèõ ïîä³é âîíè òàêîæ ïîâèíí³ ðåàãóâàòè.

Tkinter, ÿê ïðîãðàìíà íàäáóäîâà Python, òàêîæ (çà äîïîìîãîþ ÿäðà Python) ðåºñòðóº â îïåðàö³éí³é ñèñòåì³ ïî䳿 íà ÿê³ íåîáõ³äíî ðåàãóâàòè.  ïåðøó ÷åðãó äî òàêèõ ïîä³é â³äíîñÿòüñÿ ïî䳿 êëàâ³àòóðè òà ìèøêè.  ñâîþ ÷åðãó, Tkinter çáèðຠñïèñîê íåîáõ³äíèõ ïîä³é â³ä â³äæåò³â, ùî çàñòîñóâàâ ïðîãðàì³ñò â ñâî¿é ïðîãðàì³, òà âèêîíóº ìàðøðóòèçàö³þ òàêèõ ïîä³é â³äïîâ³äíèì â³äæåòàì äëÿ âíóòð³øíüî¿ îáðîáêè òà ïîäàëüøî¿ ìàðøðóòèçàö³¿ äî ïðîãðàì, ùî êîäóº ïðîãðàì³ñò, òîáòî îáðîáíèê³â ïîä³é

ϳäêëþ÷åííÿ îáðîáíèê³â ïîä³é, ùî êîäóº ïðîãðàì³ñò, âèêîíóºòüñÿ (ÿê ïðàâèëî) çà äîïîìîãîþ äâîõ ïðîãðàìíèõ ³íòåðôåéñ³â. Öå ³íñòðóêö³ÿ bind àáî àòðèáóò command (ÿêùî â³í âõîäèòü äî ñêëàäó àòðèáóò³â â³äæåòà, íàïðèêëàä: Button, Checkbutton, Radiobutton, Spinbox, Scrollbar, Scale)

ϳäêëþ÷åííÿ (ïðèâÿçêà) îáðîáíèêà ïîä³é ³íñòðóêö³ºþ bind

  ³ì'ÿ_â³äæåòà.bind("<³ì'ÿ_ïî䳿>", ³ì'ÿ_îáðîáíèêà)

Íàâåäåìî ïðîñòèé ïðèêëàä:

def MyEventHandler(event) # Îáðîáíèê ïî䳿
  print(event) # Ðîçäðóêóâàòè äîñòóïí³ âëàñòèâîñò³
. . .
Lb01 = Label(root, text="test")
Lb01.bind("<Button-1>", MyEventHandler) # ϳäêëþ÷åìî êíîïêó ìèøêè
. . .

 öüîìó ïðèêëàä³ êîä ïðîãðàìè ï³äêëþ÷ຠîáðîáíèê ïî䳿 MyEventHandler ï³äêëþ÷åíèé íà ïîä³þ "êë³ê íà ë³â³é êíîïö³ ìèøêè", ÿêà âèíèêຠÿêùî êóðñîð çíàõîäèòüñÿ íà íàäïèñó Lb01. ³äïîâ³äíî îáðîáíèê MyEventHandler ðîçäðóêîâóº âñ³ äîñòóïí³ âëàñòèâîñò³ (property) îá'ºêòà event, ùî êîíêðåòíèé â³äæåò ïåðåäຠîáðîáíèêó ÿê ïàðàìåòð.

Ïðîòå Tkinter äîçâîëÿº çàñòîñîâóâàòè çíà÷íó ê³ëüê³ñòü ïîä³é (òà ¿õ ìîäèô³êàö³é), ùî êîäóþòüñÿ ïðîãðàì³ñòîì ÿê êîíêðåòíà ñòðîêà "<³ì'ÿ_ïî䳿>".

Âàð³àíòè ï³äêëþ÷åííÿ òà â³äïîâ³äíîãî ñèíòàêñèñó ³íñòðóêö³¿ bind

1) ϳäêëþ÷åííÿ ïî䳿 òà ïåðåäà÷à îáðîáíèêó êð³ì îá'ºêòà event ùå îäíðãî àáî äåê³ëüêà äîäàòêîâèõ ïàðàìåòð³â. Ïàðàìåòðè ìîæíà êîäóâàòè êîíñòàíòàìè àáî ³ìåíàìè çì³ííèõ (â îáðîáíèê ïåðåäàºòüñÿ çíà÷åííÿ çì³ííî¿). Âèá³ð ³ìåí ó âèãëÿä³ ev, x òà y íå º îáîâ'ÿçêîâèì, àëå ³ì'ÿ Event òðåáà êîäóâàòè òàê, ÿê ïîêàçàíî â ñèíòàêñèñ³

 ³ì'ÿ_â³äæåòà.bind("<³ì'ÿ_ïî䳿>", (lambda_ôóíêö³ÿ))
    äå lambda_ôóíêö³ÿ êîäóºòüñÿ íàñòóïíèì ÷èíîì:
 lambda ev=Event, x=ïàðàìåòð1, y=ïàðàìåòð2 : ³ì'ÿ_îáðîáíèêà(ev,x,y)
    Ïðèêëàä íàâåäåíî ó ïðîãðàì³ event_05_bind_lambda.py

2) ϳäêëþ÷åííÿ äâîõ îáðîáíèê³â íà îäíó ïîä³þ. Çâè÷àéíî ìè ìàºìî ìîæëèâ³ñòü âèêëèêàòè ç îáðîáíèêà_1 (ÿê ôóíêö³þ) îáðîáíèê_2, òà ÿêùî íàâåäåí³ îáðîáíèêè ïëàíóºòüñÿ íåçàëåæíî âèêëèêàòè ç ³íøèõ ïîä³é, òî òàêà ìîæëèâ³ñòü ñòຠîáãðóíòîâàíîþ.

 ³ì'ÿ_â³äæåòà.bind("<³ì'ÿ_ïî䳿>", ³ì'ÿ_îáðîáíèêà_1)
 ³ì'ÿ_â³äæåòà.bind("<³ì'ÿ_ïî䳿>", ³ì'ÿ_îáðîáíèêà_2, add="+")
    Ïðèêëàä íàâåäåíî ó ïðîãðàì³ event_06_bind_add.py

3) ϳäêëþ÷åííÿ îáðîáíèêà íà â³ðòóàëüíó ïîä³þ. ³ðòóàëüíà ïîä³ÿ îá'ºäíóå äåê³ëüêà çâè÷àéíèõ ïîä³é òà ÿêùî îáðîáíèê ï³äêëþ÷åí íà â³ðòóàëüíó ïîä³þ, òî êîæíà ç ðåàëüíèõ ïîä³ (â ñêëàä³ â³ðòóàëüíî¿) ³í³ö³þº âèêëèê òàêîãî îáðîáíèêà.

 ³ì'ÿ_â³äæåòà.bind("<<³ì'ÿ_â³ðòóàëüíî¿_ïî䳿>>", ³ì'ÿ_îáðîáíèêà)
    Ïðèêëàä íàâåäåíî ó ïðîãðàì³ event_07_bind_virtual.py

Ùîá âèêîðèñòîâóâàòè â³ðòóàëüíó ïîä³þ ¿³ ç ïî÷àòêó òðåáà ñòâîðèòè. Äëÿ öüîãî çàñòîñîâóºòüñÿ ³íñòðóêö³ÿ event_add

 ³ì'ÿ_â³äæåòà.event_add("<<³ì'ÿ_â³ðòóàëüíî¿_ïî䳿>>", ñïèñîê_ïîä³é)
    äå ñïèñîê_ïîä³é êîäóºòüñÿ íàñòóïíèì ÷èíîì:
 "<³ì'ÿ_ïî䳿_1>", ... , "<³ì'ÿ_ïî䳿_N>"
    Ïðèêëàä íàâåäåíî ó ïðîãðàì³ event_07_bind_virtual.py

Ðåàëüíó ïîä³þ ìîæíà òàêîæ âèêëþ÷èòè ç³ ñêàäó â³ðòóàëüíî¿. Äëÿ öüîãî çàñòîñîâóºòüñÿ ³íñòðóêö³ÿ event_delete. Ïðåô³êñ ³ì'ÿ_ äëÿ ñêîðî÷åííÿ òåêñòó íå âêàçàíî.

 â³äæåò.event_delete("<<â³ðòóàëüíà_ïîä³ÿ>>","<ïîä³ÿ>")
    Ïðèêëàä íàâåäåíî ó ïðîãðàì³ event_07_bind_virtual.py

ϳäêëþ÷åííÿ (ïðèâÿçêà) îáðîáíèêà àòðèáóòîì command

ßùî äî ñêëàäó àòðèáóò³â â³äæåòó âõîäèòü àòðèáóò command, òî çà çàìîâ÷åííÿì òàêèé â³äæåò áóäå ðåàãóâàò³ íà ïîä³þ "<Button-1>" (ë³âà êíîïêà ìèøêè), à àòðèáóò command áóäå âèçíà÷àòè â³äïîâ³äíèé îáðîáíèê ïî䳿 òà ç ÿêèìè ïàðàìåòðàìè éîãî òðåáà âèêîíàòè. Ó ïðèêëàäíîìó ïðîãðàìóâàíí³ ðåêîìåíäóºòüñÿ âèêëèêàòè îáðîáíèê çà äîïîìîãîþ Lambda ôóíêö³¿:

  command = lambda_ôóíêö³ÿ
    äå lambda_ôóíêö³ÿ êîäóºòüñÿ íàñòóïíèì ÷èíîì:
 lambda x1=ïàðàìåòð1, x2=ïàðàìåòð2 : ³ì'ÿ_îáðîáíèêà(x1,x2)

Lambda ôóíêö³ÿ, öå ôóíêö³ÿ ùî íå ìຠñâîãî èì'ÿ òà ÷àñò³øå çà âñå âèêîðèñòîâóºòüñÿ ÿê ³íòåðôåéñ äÿ ïåðåäà÷³ çíà÷åíü ïàðàìåòð³â â îáðîáíèê ïîä³é. Àëå ìîæëèâîñò³ Lambda ôóíêö³¿ çíà÷íî øèðøå - äåòàëüí³øå ïðî òàê³ òìîæëèâîñò³ ìîæíà ä³çíàòèñÿ çà ïîñèëàííÿì:

    Êàê èñïîëüçîâàòü ëÿìáäà-ôóíêöèè Python


 
 

³äêëþ÷åííÿ îáðîáíèêà ³íñòðóêö³ºþ unbind

Çâè÷àéíó àáî â³ðòóàëüíó ïîä³þ ìîæíà òàêîæ â³äêëþ÷èòè â³ä îáðîáíèêà íà êîíêðåòíîìó â³äæèò³. äëÿ öüîãî çàñòîñîâóºòüñÿ òàêà ³íñòðóêö³ÿ:

  ³ì'ÿ_â³äæåòà.unbind("<³ì'ÿ_ïî䳿>")
    àáî
  ³ì'ÿ_â³äæåòà.unbind("<<³ì'ÿ_â³ðòóàëüíî¿_ïî䳿>>")

Äëÿ óíèêíåííÿ ïîìèëîê ñë³äêóéòå ùîá â³äêëþ÷åííÿ âèêîíóâàëîñü â³äïîâ³äíèì unbind, òîáòîî ÿêùî ï³äêëþ÷åííÿ âèêîíóâàëîñÿ bind_all, òî â³äêëþ÷åííÿ òàêîæ ïîâèííî âèêîíóâàòèñÿ unbind_all.

ϳäêëþ÷åííÿ îáðîáíèêà ³íñòðóêö³ºþ tag_bind

tag_bind öå ñïåöèô³÷íå ï³äêëþ÷åííÿ îáðîáíèêà ï äî ãðàô³÷íèõ îá'ºêò³â íà canvas, òàêèõ ÿê ë³í³ÿ, ïðÿìîêóòíèê, åë³ïñ òîùî. Êîëè íà canvas ñòâîðþºòüñÿ ãðàô³÷íèé ºëåìåíò, ìåòîä ñòâîðåííÿ .create_åëåìåíò ïîâåðòຠ÷èñëî-³äåíòèô³êàòîð ºëåìåíòó â çàðåçåðâîâàíó çì³ííó ç ³ì'ÿì id. Âçàãàë³ ³ì'ÿ id íå º îáîâ'ÿçêîâèì àëå êðàùå ïðèòðèìóâàòèñÿ éîãî. Íàâåäåìî ïðîñòèé ïðèêëàä:

  canvas = Canvas(root, bg="white", width=250, height=150)
  canvas.pack(fill=BOTH, expand=1)
  id = canvas.create_rectangle(60, 60, 150, 150, fill="red")
  # ïðèâÿçêà ñîáûòèé ê ýëåìåíòó ñ èäåíòèôèêàòîðîì id
  canvas.tag_bind(id, "<Enter>", Handler_1)
  canvas.tag_bind(id, "<Leave>", Handler_2)

Çàóâàæèìî, ùî ï³äêëþ÷åííÿ çà äîïîìîãîþ tag_bind íå âè÷åðïóºòüñÿ ëèøå ºëåìåíòàìè íà canvas, â îêðåìèõ (÷àñò³øå ñèñòåìíèõ ïðîãðàìàõ) éîãî ìîæíà çóñòð³òè íà â³äæåòàõ text òà treeview, àëå ðîçãëÿä òàêèõ çàñòîñóâàíü âæå âèõîäèòü çà ìåæè íàøèõ çàäà÷.  íàøîìó âèïàäêó tag_bind íà canvas öå çðó÷íèé çàñ³á äëÿ ðîçðîáêè ³íòåðàêòèâíèõ ìàï êîíñòðóêòîðñüêîãî, òåõí³÷íîãî òà ãåîãðàô³÷íîî íàïðÿìêó. Àëå äëÿ ïðîôåñ³éíîãî çàñòîñóâàííÿ òåã³â òðåáà äåòàëüíî îïàíóâàòè çíà÷íó ê³ëüê³ñòü ³íñòðóìåíò³â, øî íàâåäíåí³ çà íàñòóïíèì ïîñèëàííÿì:

    Ìåòîäû Canvas âèäæåòîâ

Ïðîñòèé ïðèêëàä íàâåäåíî ó ïðîãðàì³ event_08_tag_bind.py

ÏÐÈÊËÀÄÈ
  • event_01_bind_unbind.py
    Ïðèêëàä ï³äêëþ÷åííÿ òà â³äêëþ÷åííÿ ïî䳿 (òîáòî êë³ê ë³âîþ êíîêîþ ìèøêè) íà âåðõí³é êíîïö³ â³êíà.

  • event_02_bind_all_key.py
    Ïðèêëàä ï³äêëþ÷åííÿ òà â³äêëþ÷åííÿ ïî䳿 Key (òîáòî íàòèñêàííÿ êëàâ³ø íà êëàâ³àòóð³) äî ãîëîâíîãî â³êíà root. Êëàâ³àòóðí³ ïî䳿 ìàþòü âèñîêó çàëåæíûñòü ââ³ä ïëàòôîðìè òà îïåðàö³éíî¿ ñèñòåìè.  íàøîìó âèïàäêó ðîçãëÿíóòî ïðèêëàä äëÿ ñèñòåì Windows:

    • KeyPress - Ïðè óòðèìàíí³ êëàâ³øè ãåíåðóþòüñÿ ïîâòîðè.
    • KeyRelease - Ïðè óòðèìàíí³ êëàâ³øè ïîâòîðè ÍÅ ãåíåðóþòüñÿ, àëå ³ãíîðóþòüñÿ êèð³ëè÷í³ ñèìâîëè.

    Çàçâè÷àé (ó Windows) êîìá³íàö³¿ ç êëàâ³øîþ Alt Tkinter ïåðåõîïëþº òà áëîêóå ÿê äîñòóïí³ ïî䳿, òàêîæ îêðåì³ êîìá³íàö³¿ ç êëàâ³øîþ Ctrl (îñîáëèâî äëÿ ïîä³é, ÿê³ çàñòàñîâóº ñàì Pyton àáî îïåðàö³éíà ñèñòåìà) çäàòí³ íåïðèºìíî çäèâóâàòè ïðîãðàì³ñòà.  öüîìó ñåíñ³, îñîáëèâî êîëè âè ïëàíóºòå êðîñïëàòôîðìèíó ïðîãðàìó, êðàùå óíèêàòè çàñòîñóâàííÿ îçíà÷åíèõ ïîä³é àáî áóòè ãîòîâèì äî ãëèáîêîãî çàíóðåííÿ ó öþ ïðîáëåìó.

  • event_03_patterns.py
    Ïðèêëàä çàñòîñóâàííÿ ìîäèô³êàòîðîâ ïî䳿.  ïåâíîìó ñåíñ³ öåé ïðèêëàä â³äïîâ³äຠíà ïîòðåáó êîäóâàòè ðåàêö³¿ ïðîãðàìè íà ñêëàäí³ êîìá³íàö³¿, ÿê òî Alt-F1, Ctrl-F1 àáî Shift-F1.

  • event_04_samples.py
    Íàâåäåíî ÷îòèðè ïðèêëàäè ðîáîòè ç ð³çíèìè ïîä³ÿìè. Ïðèêëàäè ³ëþñòðóþòü ðîáîòó ç ïîä³ÿìè ç³ ñïèñêó, ÿêèé ôîðìóº Tkinter, ïðîñëóõîâóþ÷è ïî䳿 îïåðàö³éíî¿ ñèñòåìè.  ñâîþ ÷åðãó ð³çí³ â³äæåòè ìîæóòü âèêîðèñòîâóâàòè âëàñí³ âèá³ðêè ïîä³é ç òàêîãî ñïèñîêó. Ïðî òå, ùî äîçâîëÿº âèêîðèñòîâóâàòè êîíêðåòíèé â³äæåò, ìîæíà ç'ÿñóâàòè âèêîíàâøè HelpEvent.py
    Ó ïðèêëàäàõ 1 ³ 3 çâ'ÿçóâàííÿ êîíêðåòíî¿ ïî䳿 çä³éñíþºòüñÿ ìåòîäîì bind íà â³äæåò.
    Ó ïðèêëàäàõ 2 ³ 4 çâ'ÿçóâàííÿ ïîä³é ç îáðîáíèêîì âèêîíóºòüñÿ àáî àòðèáóòîì command ó òèõ â³äæåòàõ, äëÿ ÿêèõ òàêèé àòðèáóò ïåðåäáà÷åíèé (ïðèêëàä 2), àáî âèêîðèñòîâóºòüñÿ ñïåö³àëüíå çâ'ÿçóâàííÿ, ùî íàäàºòüñÿ ³ìïîðòîâàíèì ìîäóëåì (ïðèêëàä 4)
    Âñ³ íàïèñàí³ ïðèêëàäè íåçàëåæí³ îäèí â³ä îäíîãî ³ ìîæóòü âèêîðèñòîâóâàòèñü ÿê ñàìîñò³éí³ øàáëîíè.

  • event_04_samples_FrmFix.py
    Òåæ ñàìå ùî ³ event_04_samples.py, àëå ç ôðåéìàìè ô³êñîâàíîãî ðîçì³ðó.

  • event_05_bind_lambda.py
    ßêùî âè âèêîðèñòîâóºòå ïðîñòèé ñèíòàêñ³ñ bind, òîáòî:
      ³ì'ÿ_â³äæåòà.bind("<³ì'ÿ_ïî䳿>", ³ì'ÿ_îáðîáíèêà)
    òî â îáðîáíèê ïî䳿 ïåðåäàºòüñÿ ëèøå îáüºêò event. Äîñèòü ÷àñòî öüîãî äëÿ ïðîãðàì³ñòà íå º íåäîñòàòí³ì. Äàíèé ïðèêëàä ïîêàçóº ÿê ìîæíà âèð³øèòè öþ ïðîáëåìó (äèâ. ïîõ³äíèé êîä)

  • event_06_bind_add.py
     îêðåìèõ âèïàäêàõ ïðîãðàì³ñòó íåîáõ³äíî âèêëèêàòè äåê³ëüêà îáðîáíèê³â ïðè âíèíèêí³ ïåâíî¿ ïî䳿, â òîé æå ÷àñ, òàê³ îáîðîáíèêè ìàþòü íåçàëåæíî âèêëèêàòèñÿ ³íøèìè ïîä³ÿìè.  òàêîìó ðàç³ çðó÷íî çàñòîñîâóâàòè íàñòóïíèé ñèíòàêñ³ñ bind:
     ³ì'ÿ_â³äæåòà.bind("<³ì'ÿ_ïî䳿>", ³ì'ÿ_îáðîáíèêà_1)
     ³ì'ÿ_â³äæåòà.bind("<³ì'ÿ_ïî䳿>", ³ì'ÿ_îáðîáíèêà_2, add="+")

  • event_07_bind_virtual.py
    Äàíèé ïðèêëàä ÿêáè â³äçåðêàëþå çàäà÷ó ðîçãëÿíóòó â event_06_bind_add.py. Òîáòî, ³ëþñòðóº ÿêèì ÷èíîì ìîæíà âèêëèêàòè îäèí îáðîáíèê ïðè âèíèêíåí³ ð³çíèõ ïîä³é, à òàêîæ ³ëþñòðóº ÿê ìîæíà êåðóâàòè ñïèñêîì òàêèõ ïîä³é.

  • event_08_tag_bind.py
    Ïðèêëàä ï³äêëþ÷åííÿ îáðîáíèê³â ³íñòðóêö³ºþ tag_bind ê ãðàô³÷íèì åëåìåíòàì íà canvas

  • HelpEvent.py
    Help on class Event in module tkinter
 
 

 
  Äî ìåíþ ñòîð³íêè

 
 
Ðîçä³ë 4. CANVAS (ÏÎËÎÒÍÎ) TKINTER

Ñüãîäí³ ïðàêòè÷íî âñ³ îïåðàö³éí³ ñèñòåìè òà àëãîðèòì³÷í³ ìîâè âèñîêîãî ð³âíÿ âèêîðèñòîâóþòü ãðàôè÷í³ ³íòåðôåñè äëÿ âçàºìî䳿 ç ê³íöåâèì êîðèñòóâà÷åì. Íàé÷àñò³øå ãðàô³êà â ñêëàä³ àëãîðèòì³÷íèõ ìîâ âèñîêîãî ð³âíÿ ðåàë³çóºòüñÿ ÷åðåç ïðîì³æí³ ïðîãðàìí³ ³íòåðôåéñè çàñîáàìè ùî âáóäîâàí³ â îïåðàö³éí³ ñèñòåìè. Òàêà àðõèòåêòóðà ãðàô³êè çíà÷íî ðîçøèðþº êðîñïëàòôîðìåí³ ÿêîñò³ ìîâ ïðîãðàìóâàííÿ.  òîé æå ÷àñ, îêðåì³ âèñîêîð³âí³ ìîâè ïðîãðàìóâàííÿ (â òîìó ÷èñë³ ³ Python) ñòâîðåí³ ÿê êîíñîëüí³ ³íòåïðèòàðîðè òà äëÿ ðàáîòè ç ãðàô³êîþ ïîòðåáóþòü äîäàòêîâèõ ïðîãðàìíèõ íàäáóäîâ - IDLE (Integrated Development and Learning Environment) äëÿ ïðîãðàì³ñòà íà íàäáóäîâ äëÿ ðåàë³çàö³¿ ïðîãðàì (â íàøîìó âèïàäêó öå íàäáóäîâà Tkinter, ÿêó ìè ðîçãëÿäàºìî).

³äîìîþ îñîáëèâ³ñòþ Python, º éîãî îá'åêòíà àðõèòåêòóðà. Òîáòî êîæíà îêðåìà îäèíèöÿ ç ÿêîþ îïåðóº Python öå îá'åêò ùî ìàå ñâ³é òèï, à òàêîæ ìîæå ìàòè ñâî¿ ìåòîäè òà âëàñòèâîñò³. Öÿ îñîáëèâîñòü ï³äêðåñëþºòüñÿ âî âñ³õ îô³ö³éíèõ äîêóìåíòàõ Python. Ùî öå îçíà÷ຠç òî÷êè çîðó êîìï'þòåðíî¿ ãðàô³êè? - Ïîïåðøå íåîáõ³äí³ñòü ñòâîðèòè îá'åêò canvas (ïîëîòíî), ÿêèé áóäå îñíîâîþ äëÿ ³íøèõ ãðàô³÷íèõ åëåìåíò³â çîáðàæåííÿ. Ïîäðóãå, êîæåí ãðàô³÷íèé åëåìåíò çîáðàæåííÿ (äàë³ ô³ãóðà) òàêîæ ìຠáóòè ñòâîðåíèé ÿê îá'åêò, òîáòî ë³íèÿ, ïðÿìîêóòíèê, åë³ïñ òà ³íø³ ô³ãóðè öå îá'åêòè ùî ìàþòü ñâîè âëàñòèâîñò³ òà ñâî¿ ìåòîäè. Äëÿ ïðèêëàäíîãî ïðîãðàì³ñòà òàêà àðõèòåêòóðà çíà÷íî ñïðîùóº ñòâîðåííÿ ïðîãðàì. Íàïðèêëàä, ìåòîä move âèäàëÿº ôèãóðó íà ñòàðîìó ì³ñö³, â³äíîâëþº çîáðàæåííÿ ùî ïåðåêðèâàëà ô³ãóðà òà ìàëþº ô³ãóðó íà íîâîìó ì³ñö³. Òîáòî äëÿ ïåðåì³ùåííÿ ô³ãóðè äîñòàòüíüî îäí³º¿ ³íñòðóêö³¿ (äèâ. canvas_03_ElasticFigure.py).

Ïî÷íåìî ç³ ñòâîðåííÿ îá'åêòà canvas. Canvas öå îêðåìèé â³äæåò Tkinter òà ñòâîðþºòüñÿ ïîä³áíî ³íøèì â³äæåòàì:

 ³ì'ÿ_canvas = Canvas(³ì'ÿ_â³êíà_àáî_ôðåéìà, Ñïèñîê_àòðèáóò³â)

Òåïåð ìè ìàºìî çìîãó ñòâîðþâàòè òà ìàëþâàòè ôèãóðè íà öüîìó ïîëîòí³

 ³ì'ÿ_canvas.create_³ì'ÿ_ô³ãóðè(Ñïèñîê_àòðèáóò³â_ô³ãóðè)
    àáî
 Id = ³ì'ÿ_canvas.create_³ì'ÿ_ô³ãóðè(Ñïèñîê_àòðèáóò³â_ô³ãóðè)

Äî ñêëàäó ô³ãóð, ùî ìîæíà ñòâîðèòè â canvas Tkinter âõîäÿòü:

  • .create_arc()
  • .create_bitmap()
  • .create_image()
  • .create_line()
  • .create_oval()
  • .create_polygon()
  • .create_rectangle()
  • .create_text()
  • .create_window()
Äîêëàäí³øå äèâèñü çà ïîñèëàííÿì:

The Canvas widget

 
 

Çíà÷íà ê³ëüê³ñòü àòðèáóò³â, ùî âõîäÿòü äî ñêëàäó canvas òà ô³ãóð íå äîçâîëÿº â ðàìêàõ îáñÿãó ö³º¿ ñòîð³íêè íàäàòè äåòàëüí³ ïîÿñíåííÿ àáî ïðèêëàäè. Òîìó çîñåðåäèìîñÿ ëèøå íà ïðèêëàäàõ ùî îð³ºíòîâàí³ íà òåõí³÷í³ çàäà÷³.

Ïðèêëàäè
  • Ïàïêà canvas_01_Trigonometry
    Ïðèêëàä â³äîáðàæåííÿ 2D - ãðàô³êó äëÿ îêðåìèõ òðèãîíîìåòðè÷íèõ ôóíêö³é. Öåé ïðèêëàä â ïåðøó ÷åðãó ö³êàâèé òèì, ùî â³í ³ëþñòðóº çàñòîñóâàííÿ âëàñíî¿ (ñòâîðåíî¿ ïðîãðàì³ñòîì) á³áë³îòåêè. Òàêà á³áë³îòåêà ðîçòàøîâàíà â äîäàòêîâ³é ïàïö³ Tools òà ìຠíàçâó GraphXY.py.  îñíîâíó ïðîãðàìó ç ö³º¿ á³áë³îòåêè ³ìïîðòóþòüñÿ íàñòóïí³ ôóíêö³¿:

    from Tools.GraphXY import CnvSize, CnvClean, CnvShowFunc

    ³äïîâ³äíî ³ìïîðòîâàí³ ôóíö³¿ äîçâîëÿþòü:

    • CnvSize - çì³íþâàòè âèñîòó òà øèð³íó ñòâîðåííîãî ïðîãðàìîþ canvas
    • CnvClean - ïîâí³ñòþ î÷èòèòè canvas òà âèäàëèòè âñ³ ô³ãóðè
    • CnvShowFunc - íàìàëþâàòè 2D - ãðàô³ê ïî äàíèì, ùî ïîïåðåäíüî ðîçðàõîâàí³ ÿê ñïèñîê [x1,y1, x2,y2, x3,y3, . . . , xN,yN]

    Çâ³ñòíî, á³áë³îòåêà GraphXY.py äóæå ïðîñòà, òîìó ³¿ ïîõ³äíèé êîä íå ïîâèíåí, ïðè ÷èòàíí³, çàäàòè çàíàäòî êëîïîòó.

  • Ïàïêà canvas_02_Polinom
    Ïðèêëàä â³äîáðàæåííÿ 2D - ãðàô³êó äëÿ ñòåïåíåâîãî áàãàòî÷ëåíà. Öåé ïðèêàëä òàêîæ âèêîðèñòîâóº á³áë³îòåêó GraphXY.py. Âî÷åâèäü éîãî ìîæíà áóëî ïîì³ñòèòè â îäíó ïàïêó ç canvas_01_Trigonometry, àëå â³í â³äîêðåìëåí ÿê ñàìîñò³éíå ð³øåííÿ äëÿ óíèêíåííÿ êëîïîòó ç ïåðåíîñîì ïðîãðàìè â ³íø³ ïàïêè àáî äèñêè.

  • canvas_03_ElasticFigure.py
    Ïðèêëàä ìàëþâàííÿ åëàñòè÷íèìè ô³ãóðàìè. Öåé ïðèêëàä º ³ëþñòðàö³ºþ ïî÷àòêîâî¿ ôàçè ðîçðîáêè ãðàô³÷íîãî ðåäàêòîðó. Ïîõ³äíèé êîä ïèêëàäó ù³ëüíî ïðîêîìåíòîâàíèé, òîìó äîäàòêîâèõ êîìåíòàð³â íàâîäèòè íå áóäåìî.

  • Ïàïêà canvas_04_Bridge
    Öåé ïðèêëàä ìîæíî â³äíåñòè äî ìàëåíüêîãî æàðòó ç ïðèâîäó àðõ³òåêòóðè ìîñòà ùî ïëàíóºòüñÿ íà ìàñèâ³ Îáîëüíü â Êèºâ³. Ìàþ íàä³þ, ùî çàê³í÷óþ÷è ñòîð³íêó æàòðîì, äîäàì âàì îïò³ì³çìó â îïàíóâàíí³ ìàòåð³àëó ñòîð³íêè.

 

 
 
  Äî ìåíþ ñòîð³íêè