Ҷойгиркунӣ
Ҷойгиркунӣ барои чӣ муҳим аст
Ҳангоми тағйири андозаи равзана шакл бояд қулай монад: майдон васеъ шавад, навишта назди он истад ва тугмаҳо ҳамдигарро напӯшонанд. Агар ҳар пикселро дастӣ ҳисоб кунем, иваз кардани ҳуруф ё тарҷумаи матн интерфейсро зуд вайрон мекунад. Менеҷери геометрия аз рӯйи қоидаҳо ба виджетҳо ҷой ҷудо мекунад.
Дар Tkinter pack, grid ва place ҳастанд. Интихоб аз сохтор вобаста аст: сутуни унсурҳо, ҷадвал ё ҷойи дақиқ. Ҳар мисоли зер равзанаи пинҳони худро месозад ва мебандад; параметрҳои ҷойгиркуниро чоп мекунем, ки аз андозаи экран вобаста нестанд.
1. pack: ҷой дар канори контейнер
pack() пайдарпай аз канори top, bottom, left ё right ҷой ҷудо мекунад. Бо нобаёнӣ унсурҳо аз боло ба поён меоянд. padx ва pady фосилаи берунии уфуқӣ ва амудӣ медиҳанд. fill виджетро дар ҷойи ҷудошуда аз рӯйи меҳвари x, y ё ҳар ду (both) мекашад.
import tkinter as tk
root = tk.Tk()
root.withdraw()
label = tk.Label(root, text="Панел")
label.pack(side="top", fill="x", padx=8)
info = label.pack_info()
print(info["side"], info["fill"], info["padx"])
root.destroy()
Барориш:
top x 8
expand=True ва fill вазифаҳои гуногун доранд. expand иҷозат медиҳад, ки виджет аз ҷойи иловагии контейнер ҳисса гирад, fill бошад, муайян мекунад, ки худи виджет он ҷойро пур мекунад ё не. Тугмаи дуюми зер ҷойи иловагӣ мегирад ва дар он васеъ мешавад.
import tkinter as tk
root = tk.Tk()
root.withdraw()
for value in (False, True):
button = tk.Button(root, text="OK")
button.pack(expand=value, fill="both")
info = button.pack_info()
print(info["expand"], info["fill"])
root.destroy()
Барориш:
0 both
1 both
2. grid: сатрҳо, сутунҳо ва канорҳои катак
grid() унсурҳоро дар ҷадвал ҷойгир мекунад. row сатр ва column сутун аст; рақамгузорӣ аз сифр оғоз мешавад. columnspan ба як виджет чанд сутун ва rowspan чанд сатр медиҳад. Инҳо андоза бо пиксел нестанд.
sticky муайян мекунад, ки виджет ба кадом канорҳои катак часпад: n боло, s поён, e рост ва w чап аст. ew ба таври уфуқӣ васеъ мекунад. Бе sticky виджет одатан дар маркази катаки худ мемонад.
import tkinter as tk
root = tk.Tk()
root.withdraw()
label = tk.Label(root, text="Ҷустуҷӯ")
label.grid(row=1, column=0, columnspan=2, sticky="ew")
info = label.grid_info()
print(info["row"], info["column"], info["columnspan"], info["sticky"])
root.destroy()
Барориш:
1 0 2 ew
Барои он ки катак ҳамроҳи равзана калон шавад, сатр ё сутуни он ба вазн ниёз дорад. weight=0 ҷойи иловагӣ намегирад; вазнҳои мусбат онро мутаносиб тақсим мекунанд. Вазнро барои волидайн ва sticky-ро барои виджети фарзанд танзим мекунанд. Ҳар ду шарт лозим аст: катаки васеъшаванда ва унсуре, ки дар он мекашад.
import tkinter as tk
root = tk.Tk()
root.withdraw()
root.grid_columnconfigure(1, weight=2, minsize=100)
entry = tk.Entry(root)
entry.grid(row=0, column=1, sticky="ew")
info = root.grid_columnconfigure(1)
print(info["weight"], info["minsize"])
root.destroy()
Барориш:
2 100
3. Frame вазифаҳоро ҷудо мекунад
Frame контейнер барои гурӯҳи виджетҳост. Онро дар равзана ҳамчун як унсур ҷойгир карда, баъд фарзандонашро алоҳида мечинанд. Барои фарзандони як волидайн pack ва grid-ро омехта намекунанд: ҳар ду менеҷер мехоҳанд андозаи ҳамон контейнерро идора кунанд. Волидайнҳои гуногун метавонанд менеҷерҳои гуногун дошта бошанд.
import tkinter as tk
root = tk.Tk()
root.withdraw()
pad = tk.Frame(root)
pad.pack()
button = tk.Button(pad, text="OK")
button.grid(row=0, column=0)
print(pad.winfo_manager(), button.winfo_manager())
root.destroy()
Барориш:
pack grid
4. place ва фармонҳо дар давра
place() координатаҳоро дар дохили волидайн медиҳад. x ва y пикселанд, relx ва rely ҳиссаҳои андозаи контейнеранд. anchor="center" маркази виджетро ба нуқта мегузорад, на кунҷи онро. Ин менеҷер барои унсурҳои рӯйи ҳам қулай аст, аммо мутобиқшавии андозаҳоро бояд худатон ба нақша гиред.
Ҳангоми сохтани чанд тугма фармони ҳар яке бояд қимати худро дар хотир нигоҳ дорад. lambda функсияи кӯтоҳ аст. Параметри пешфарзи i=i қиматро дар лаҳзаи сохтани функсия нигоҳ медорад; вагарна ҳамаи фармонҳо баъдтар як тағйирёбандаи давраро мехонанд.
import tkinter as tk
root = tk.Tk()
root.withdraw()
label = tk.Label(root, text="Марказ")
label.place(relx=0.5, rely=0.5, anchor="center")
print(label.place_info()["anchor"])
buttons = []
for i in range(3):
button = tk.Button(root, command=lambda i=i: print(i))
buttons.append(button)
for button in buttons:
button.invoke()
root.destroy()
Барориш:
center
0
1
2
Тугмаҳои ин мисол ҷойгир нашудаанд: танҳо фармонҳояшон санҷида мешаванд. Дар интерфейси пурра барои ҳар тугма катак ҳам интихоб мекунанд. Ҳолати бозиро аз матни тугмаҳо ҷудо нигоҳ доред: он гоҳ тағйири ҷойгиркунӣ қоидаҳои бозиро дигар намекунад.
Менеҷер ҷойро чӣ гуна ҳисоб мекунад
Виджет аз рӯйи матн, ҳуруф ва фосилаҳо андоза дархост мекунад. Контейнер дархостҳои фарзандонро ҷамъ мекунад, баъд менеҷер ҷойи дастрасро тақсим мекунад. grid паҳноии умумии сутунҳо, катакҳои якҷоя ва вазнҳоро ба назар мегирад. Ин ба рафҳо монанд аст: аввал андозаи бахшҳоро муайян мекунанд, баъд чизҳоро ба канори лозим мегузоранд. Даври рӯйдодҳо ҳисобро нав мекунад.
Хатоҳои маъмул ва ислоҳи онҳо
Label(root).pack()ваEntry(root).grid()дар як контейнер баTclErrorмеоранд.Frame-и ҷудо созед ё як менеҷер интихоб кунед.- Танҳо
sticky="ew"васеъшавии майдонро кафолат намедиҳад: сутун метавонад танг монад. Ба волидайнgrid_columnconfigure(..., weight=1)илова кунед. columnspan=2-ро фосилаи ду пиксел мепиндоранд. Ин ду катак аст; барои фосилаи берунӣpadx=2истифода баред.lambda: print(i)дар давра барои ҳамаи тугмаҳо қимати охирро чоп мекунад. Ислоҳ:lambda i=i: print(i).place(x=200, y=100)ҳангоми тағйири равзана унсурро дар марказ нигоҳ намедорад. Барои маркази нисбӣrelx=0.5, rely=0.5, anchor="center"истифода баред.
Ёднома
| Вазифа | Восита |
|---|---|
| Сутуни унсурҳо ё тасма | pack(side=..., fill=..., expand=...) |
| Ҷадвал | grid(row=..., column=...) |
| Чанд катак | columnspan, rowspan |
| Кашиш дар катак | sticky="nsew" |
| Ҷойи иловагӣ | grid_columnconfigure, grid_rowconfigure, weight |
| Гурӯҳ бо ҷойгиркунии худ | Frame |
| Ҷой бо пиксел ё ҳиссаҳо | place(x=..., relx=...) |