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

Майдонҳои вуруд

Вурудро барои чӣ месанҷем

Дар майдон ном, сатри холӣ, фосилаҳо ё калима ба ҷойи адад пайдо шуда метавонад. Ин амали одии корбар аст, на сабаби бо хато қатъ кардани барнома. Интерфейси хуб мефаҳмонад, ки чиро ислоҳ бояд кард ва маълумоти аллакай воридшударо нигоҳ медорад.

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

1. Entry сатрро нигоҳ медорад

Entry майдони яксатра аст. insert(index, text) аломатҳоро мегузорад, get() тамоми матнро мехонад. Индексҳо аз сифр оғоз мешаванд; tk.END охирро ифода мекунад. Дар delete(start, end) ҳудуди рост дохил намешавад. Бе end як аломат нест мешавад.

import tkinter as tk

root = tk.Tk()
root.withdraw()
entry = tk.Entry(root)
entry.pack()
entry.insert(0, "42")
print(repr(entry.get()), type(entry.get()).__name__)
entry.delete(0)
print(entry.get())
entry.delete(0, tk.END)
print(repr(entry.get()))
root.destroy()

Барориш:

'42' str
2
''

Параметри show="*" намоиши рамзро мепӯшонад, аммо get() ҳанӯз матни аслиро бармегардонад. Ин рамзгузорӣ нест. justify="center" матнро дар дохили майдон баробар мекунад, focus_set() бошад, гузаштани фокуси клавиатураро ба он дархост мекунад.

2. Яксонсозӣ ва табдил

Яксонсозӣ (normalization) шаклҳои гуногуни навиштани қиматро ба як намуд меорад. strip() фосилаҳои канориро мегирад; replace() метавонад вергули даҳиро ба нуқта иваз кунад. Ҳар ду метод сатри нав бармегардонанд. float() сатрро ба адад табдил медиҳад ё ValueError ба вуҷуд меорад.

for text in (" 7,25 ", "oops"):
    try:
        value = float(text.strip().replace(",", "."))
    except ValueError:
        print("Адад нест")
    else:
        print(f"{value:.2f}")

Барориш:

7.25
Адад нест

Табдили муваффақ ҳанӯз қимати иҷозатшударо кафолат намедиҳад. float() inf ва nan-ро мефаҳмад: беохирӣ ва қимати махсуси «адад нест». math.isfinite() танҳо ададҳои ниҳоиро қабул мекунад. Қоидаҳои соҳаи масъала ҷудо санҷида мешаванд: масалан, андозаи манфӣ нодуруст аст, ҳарчанд адади дуруст мебошад.

import math

for text in ("12", "inf", "nan"):
    value = float(text)
    print(text, math.isfinite(value))

Барориш:

12 True
inf False
nan False

3. StringVar виджетҳоро мепайвандад

StringVar тағйирёбандаи Tk аст, ки онро бо get() мехонанд ва бо set() тағйир медиҳанд. Параметри textvariable онро ба майдон ё навишта мепайвандад. Бар хилофи тағйирёбандаи одии Python, ин модели муштараки матн аст: таҳрири майдон қиматро тағйир медиҳад ва set() виджетҳои пайвастро нав мекунад. Истинод ба объекти тағйирёбандаро нигоҳ доред.

import tkinter as tk

root = tk.Tk()
root.withdraw()
name = tk.StringVar(root, value="Меҳмон")
entry = tk.Entry(root, textvariable=name)
label = tk.Label(root, textvariable=name)
entry.pack()
label.pack()
print(entry.get(), label.cget("text"))
name.set("Самира")
print(entry.get(), label.cget("text"))
root.destroy()

Барориш:

Меҳмон Меҳмон
Самира Самира

Инчунин IntVar, DoubleVar, BooleanVar ҳастанд. Барои вуруди ададии нотамом аксаран StringVar қулайтар аст: сатри холӣ ё танҳо аломати минус ҳанӯз адад нест.

4. validatecommand таҳрири пешниҳодшударо месанҷад

Бо validate="key" Tk санҷишро пеш аз тағйири майдон даъват мекунад. root.register(f) функсияи Python-ро барои Tcl дастрас мекунад. Ҷойгузории %P тамоми матни оянда-ро медиҳад, на танҳо тугмаи пахшшударо. True таҳрирро иҷозат медиҳад, False онро рад мекунад. Санҷиш бояд ҳазф ва гузоштан аз буферро ҳам ба назар гирад.

import tkinter as tk

root = tk.Tk()
root.withdraw()

def allowed(new):
    return len(new) <= 4

check = root.register(allowed)
entry = tk.Entry(root, validate="key", validatecommand=(check, "%P"))
entry.pack()
entry.insert(0, "abcd")
entry.insert(tk.END, "e")
print(entry.get())
entry.delete(0, tk.END)
print(repr(entry.get()))
root.destroy()

Барориш:

abcd
''

Дар ин ҷо ҳарфи панҷум ба майдон надаромад, аммо тоза кардан иҷозат шуд. Функсия худаш майдонро тағйир намедиҳад: тағйир дар дохили санҷиш рафторро мураккаб мекунад. isdigit() баъзе аломатҳоро мисли ² мешиносад, ки int() қабул намекунад; isdecimal() рақамҳои хатҳои дигарро ҳам иҷозат медиҳад. Агар танҳо рақамҳои ASCII лозим бошанд, узвияти аломатҳоро дар "0123456789" санҷед.

5. Чанд паём ба ҷойи хатои аввал

Барои санҷиши ниҳоӣ рӯйхати паёмҳоро ҷамъ карда, бо гузариш ба сатри нав пайвастан қулай аст. Корбар ҳамин тавр чанд майдонро якбора ислоҳ мекунад. Мисоли навбатӣ майдони ҷудои омӯзиширо месанҷад ва қоидаҳои шакли масъалаҳоро амалӣ намекунад.

def inspect(text):
    found = []
    if not text.strip():
        found.append("Номро ворид кунед")
    if "/" in text:
        found.append("Аломати слэшро гиред")
    return found

print("\n".join(inspect("/")) or "OK")

Барориш:

Аломати слэшро гиред

Барои паёмҳои ҷудогона tkinter.messagebox ҳаст: showinfo муваффақиятро хабар медиҳад, showerror хатогиро нишон медиҳад, askyesno ҷавоби True ё False медиҳад. Ин муколамаҳо ҷавоби инсонро талаб мекунанд; барои чанд хатои шакл ҳисобот дар Label қулайтар аст.

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

Tk матни майдонро нигоҳ медорад. Ҳангоми таҳрир аввал сатри пешниҳодшуда сохта мешавад, баъд санҷиш иҷро мегардад; танҳо тағйири иҷозатшуда ба майдон ва тағйирёбандаи пайваст меравад. Ҳангоми ирсоли шакл коркардкунанда матни ҷориро мехонад ва қоидаҳои ҷудоро месанҷад. Филтр ба санҷиши қолаби варақа монанд аст, санҷиши ниҳоӣ бошад, маънои маълумоти пуршударо месанҷад.

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

  1. entry.get() + 1 ба TypeError меорад: майдон сатр медиҳад. Онро бо int() ё float() дар дохили try/except ValueError табдил диҳед.
  2. float("nan") истисно намеорад, аммо адади одӣ нест. Илова бар ин math.isfinite(value)-ро санҷед.
  3. new.isdecimal() барои сатри холӣ False медиҳад ва аломати охирро нест карда намешавад. Агар тоза кардан мумкин бошад, new == ""-ро ошкоро иҷозат диҳед.
  4. entry.delete(0) як аломатро нест мекунад. Барои пурра тоза кардан entry.delete(0, tk.END) лозим аст.
  5. return [message] пас аз хатои аввал санҷишро қатъ мекунад. Паёмҳоро бо append() ҷамъ карда, рӯйхатро дар охир баргардонед.

Ёднома

  • Матн: get(), insert(0, text), delete(0, tk.END).
  • Пайвасти виджетҳо: StringVar(root), textvariable, get(), set().
  • Табдил: strip(), replace(), try/except ValueError, math.isfinite().
  • Санҷиши таҳрир: validate="key", validatecommand=(root.register(f), "%P").
  • Ҳисоботи пурра: рӯйхати паёмҳо → "\n".join(found); муколамаҳо — messagebox.