Гузариш ба мундариҷа
Мавзӯи 2 аз 6

Равзана ва виджетҳо

Равзанаҳо барои чӣ лозиманд

Консол вақте қулай аст, ки корбар фармонҳоро медонад. Барои ҳисобкунаки хурд, шакл ё танзими барнома равзанае бо навишта ва тугма фаҳмотар аст. Tkinter Python-ро бо маҷмӯи унсурҳои графикии Tk мепайвандад. Дар ин курс Tk аз Python 3.12-и насбшуда истифода мешавад; бастаи алоҳида аз pip лозим нест.

Унсури графикиро виджет меноманд. Равзанаи асосӣ виджетҳои дигарро нигоҳ медорад ва онҳо дар бораи амалҳои корбар ба барнома хабар медиҳанд. Аввал ин унсурҳоро месозему тағйир медиҳем, баъд онҳоро аз ҳисобкуниҳо ҷудо мекунем. Ҳар мисоли зер мустақил аст: равзанаи худро месозад ва мебандад. withdraw() равзанаи омӯзиширо пинҳон мекунад, то хосиятҳояшро дар консол санҷем.

1. Равзанаи асосӣ ва хосиятҳои он

tk.Tk() равзанаи асосӣ ва тафсиргари Tcl-и вобаста ба онро месозад. Номи root тағйирёбандаи одии Python аст. title() сарлавҳаро медиҳад, geometry() бошад, сатри андозаҳоро мегирад: ҳарфи лотинии x паҳноӣ ва баландиро бо пиксел ҷудо мекунад. Хосиятҳои равзанаро боз хондан ҳам мумкин аст.

import tkinter as tk

root = tk.Tk()
root.withdraw()
root.title("Қайдҳо")
root.geometry("360x180+20+40")
print(root.title())
print(root.winfo_exists())
root.destroy()

Барориш:

Қайдҳо
1

Дар барориш сарлавҳа ва 1 мебароянд: равзана вуҷуд дорад, ҳарчанд пинҳон аст. Дар 360x180+20+40 ду адади охир ҷойро нисбат ба экран медиҳанд. winfo_screenwidth() ва winfo_screenheight() андозаҳои экранро медиҳанд; қиматҳо аз компютер вобастаанд. Менеҷери равзана ҳангоми ҷойгиркунӣ чорчӯба ва сарлавҳаро ба назар гирифта метавонад, бинобар ин андозаи воқеиро фавран пас аз сохтан нахонед.

2. Виджет: сохтан, ҷойгир кардан, тағйир додан

Волидайн (parent) контейнерест, ки виджет ба он тааллуқ дорад. Дар tk.Label(root, ...) равзанаи асосӣ волидайн аст. Label матнро нишон медиҳад, Button амалро оғоз мекунад, Entry сатрро қабул мекунад, Scale интихоби қиматро бо лағжанда медиҳад, Frame унсурҳоро гурӯҳбандӣ мекунад.

Сохтани объект ҳанӯз онро дар экран ҷойгир намекунад. Менеҷери геометрияи pack() барояш ҷой ҷудо мекунад. pady фосилаи берунии амудӣ медиҳад; font ҳуруфу андоза ва fg-ю bg ранги матну заминаро муайян мекунанд. config() параметрро тағйир медиҳад, cget() онро мехонад.

import tkinter as tk

root = tk.Tk()
root.withdraw()
label = tk.Label(root, text="Пешнавис", font=("Segoe UI", 14))
print(repr(label.winfo_manager()))
label.pack(pady=12)
label.config(text="Омода", fg="green")
print(label.winfo_manager(), label.cget("text"), label.cget("fg"))
root.destroy()

Барориш:

''
pack Омода green

Сатри холӣ маънои набудани менеҷери геометрияро дорад. Пас аз pack() номи он pack мешавад. Худи виджетро дар тағйирёбанда нигоҳ доред: натиҷаи pack() None аст, на навиштаи сохташуда.

3. Тугма функсияро нигоҳ медорад

Коркардкунанда (handler) функсияест, ки интерфейс ҳангоми амали корбар даъват мекунад. Ба command функсияро бе қавс медиҳанд. Барои санҷиш button.invoke() фармони тугмаро бе пахши дастӣ иҷро мекунад. Танҳо тағйир додани тағйирёбанда навиштаро нав намекунад — config() лозим аст.

import tkinter as tk

root = tk.Tk()
root.withdraw()
label = tk.Label(root, text="Интизорӣ")
label.pack()

def on_click():
    label.config(text="Сабт шуд")

button = tk.Button(root, text="Сабт кардан", command=on_click)
button.pack()
print(label.cget("text"))
button.invoke()
print(label.cget("text"))
root.destroy()

Барориш:

Интизорӣ
Сабт шуд

4. mainloop барои чӣ лозим аст

Даври рӯйдодҳо паёмҳои системаро қабул мекунад: равзанаро аз нав кашидан, пахшро коркард кардан ё таймерро даъват кардан. mainloop() ин даврро оғоз мекунад ва одатан пас аз бастани равзана идоракуниро бармегардонад. after() функсияро барои оянда таъйин мекунад; дар ин ҷо мисолро худкор мебандад. Ҳангоми иҷрои одӣ withdraw()-ро гиред, то равзанаро бинед.

import tkinter as tk

root = tk.Tk()
root.withdraw()
print("Пеш аз давр")
root.after(30, root.destroy)
root.mainloop()
print("Пас аз бастан")

Барориш:

Пеш аз давр
Пас аз бастан

5. Мантиқ аз интерфейс ҷудо

Функсияи ҳисобкунӣ маълумоти одиро мегирад ва натиҷа бармегардонад. Он набояд худаш равзана созад ё виджетро хонад: ҳамин тавр онро мустақилона санҷидан мумкин аст. Мисоли охир матни тайёрро ба навишта медиҳад; он масъалаи шикастани сатрҳоро ҳал намекунад.

import tkinter as tk

def report(items):
    return "\n".join(items)

root = tk.Tk()
root.withdraw()
label = tk.Label(root, text=report(["Чой", "Қаҳва"]), justify="left")
label.pack()
print(label.cget("text"))
root.destroy()

Барориш:

Чой
Қаҳва

Дар масъалаҳои курс функсия барои санҷишҳо дастрас аст, сохтани равзана бошад, зери if __name__ == "__main__": ҷойгир мешавад. Ҳангоми иҷро дар компютери худ интерфейс мекушояд; ҳангоми санҷиш мантиқро бе равзана даъват мекунанд. Ин ҷудокунӣ дар барномаҳои худатон ҳам қулай аст.

Дар дохил чӣ рӯй медиҳад

Python объекти виджетро месозад ва Tkinter фармонҳоро ба Tcl/Tk медиҳад. Tk параметрҳо ва дарахти волидайнҳоро нигоҳ медорад. Менеҷери геометрия ҷойро ҳисоб мекунад, даври рӯйдодҳо бошад, паёмҳоро коркард карда, функсияҳои Python-ро даъват мекунад. Ин ба қабулгоҳ монанд аст: равзана муроҷиатҳоро бо навбат мегирад, коркардкунанда зуд ҷавоб дода, навбатро озод мекунад.

Хатоҳои маъмул ва ислоҳи онҳо

  1. command=on_click() функсияро ҳангоми сохтани тугма даъват мекунад. Натиҷаи он ба command меравад. Ислоҳ: command=on_click.
  2. label = tk.Label(root).pack() қимати None-ро нигоҳ медорад; label.config(...) ба AttributeError меорад. Аввал Label-ро таъйин кунед, баъд label.pack()-ро ҷудо даъват кунед.
  3. tk.Label(root, text="Матн") бе ҷойгиркунӣ дар равзана намоён намешавад. pack(), grid() ё place() илова кунед.
  4. root.geometry("360×180") аломати зарб дорад ва ба TclError меорад. Ҳарфи лотинии x лозим аст: "360x180".
  5. Бе mainloop() барнома равзанаро хидмат накарда анҷом меёбад. Даврро пас аз сохтани интерфейс оғоз кунед; destroy() кори равзанаро анҷом медиҳад.

Ёднома

Амал Восита
Сохтани равзанаи асосӣ tk.Tk()
Додани сарлавҳа ва андоза title(...), geometry("360x180+20+40")
Сохтани навишта ё тугма Label(root, ...), Button(root, command=f)
Ҷойгир кардани виджет pack(), grid(), place()
Тағйир додан / хондани параметр config(...) / cget(...)
Коркарди рӯйдодҳо / бастан mainloop() / destroy()