۵. ساخت پنجره و فرم ورودی¶
خط ۶۵ تا ۷۵
از اینجا کد از کلاس بیرون میآید و رابط کاربری را میسازد. اول شیء فروشگاه و پنجرهی اصلی ساخته میشوند، بعد با یک حلقه چهار ردیف «برچسب + جعبهی ورودی» برای نام، قیمت خرید، قیمت فروش و تعداد ساخته میشود.
کد این بخش¶
65shop = Shop()66root = tk.Tk()67root.title('مدیریت فروشگاه - Python')68root.geometry('760x560')69 70fields = {}71for row, (key, label) in enumerate([('name', 'نام کالا'), ('buy', 'قیمت خرید'), ('sell', 'قیمت فروش'), ('qty', 'تعداد')]):72 ttk.Label(root, text=label).grid(row=row, column=0, padx=8, pady=5, sticky='e')73 entry = ttk.Entry(root, width=28)74 entry.grid(row=row, column=1, padx=8, pady=5)75 fields[key] = entry
روی شمارهی هر خط بزن تا به توضیحش بروی؛ روی «خط …» در توضیح بزن تا همان خط در کد روشن شود.
توضیح خط به خط¶
- خط ۶۵
shop = Shop()¶ - یک شیء از کلاس
Shopمیسازد. همینجا__init__(خط ۹) اجرا و دادهها از فایل خوانده میشوند.shopیک متغیر سراسری است و همهی توابع پایین فایل از آن استفاده میکنند. - خط ۶۶
root = tk.Tk()¶ - پنجرهی اصلی برنامه را میسازد. هر برنامهی tkinter دقیقاً یک
Tk()دارد و بقیهی ویجتها داخل آن قرار میگیرند. - خط ۶۸
root.geometry('760x560')¶ - اندازهی اولیهی پنجره: ۷۶۰ پیکسل عرض و ۵۶۰ پیکسل ارتفاع. قالب رشته
'عرضxارتفاع'است. - خط ۷۰
fields = {}¶ - دیکشنری خالی برای نگهداری جعبههای ورودی. کلیدها
name،buy،sellوqtyخواهند بود تا بعداً باfields['name']به جعبهی نام برسیم. - خط ۷۱
for row, (key, label) in enumerate([('name', 'نام کالا'), ('buy', 'قیمت خرید'), ('sell', 'قیمت فروش'), ('qty', 'تعداد')]):¶ - حلقه روی لیستی از چهار تاپل (کلید، برچسب فارسی).
enumerateبه هر عضو یک شماره از ۰ تا ۳ میدهد که درrowمیرود، و(key, label)تاپل را باز میکند. پس در دور اولrow=0،key='name'وlabel='نام کالا'است. - خط ۷۲
ttk.Label(root, text=label).grid(row=row, column=0, padx=8, pady=5, sticky='e')¶ - یک برچسب متنی میسازد و همانجا با
gridدر ردیفrowو ستون ۰ میگذارد.padxوpadyفاصلهی دور ویجتاند وsticky='e'آن را به سمت شرق (راست) خانه میچسباند. چون بعداً به برچسب کاری نداریم، آن را در متغیری نگه نمیداریم. - خط ۷۳
entry = ttk.Entry(root, width=28)¶ - یک جعبهی ورودی با عرض ۲۸ کاراکتر میسازد و در
entryنگه میدارد.
ارتباط با بقیهی کد¶
همچنین ببینید
shop- در توابع
addخط ۹۴،editخط ۹۷،deleteخط ۱۰۰،sellخط ۱۰۳،reportخط ۱۱۰ و درrefreshخط ۱۱۶. root- والد همهی ویجتهاست: برچسبها خط ۷۲، جعبهها خط ۷۳، قاب دکمهها خط ۱۳۱، جدول خط ۱۳۷. تنظیم کشیدگی در خط ۱۴۳ و خط ۱۴۴ و حلقهی اصلی در خط ۱۴۶.
fields- خواندن متن در
valuesخط ۷۸–خط ۸۱،deleteخط ۱۰۰،sellخط ۱۰۳ وsearchخط ۱۰۶؛ نوشتن متن درchooseخط ۱۲۶ و خط ۱۲۷.
سؤالهای تمرینی¶
اول خودت جواب بده، بعد جواب را باز کن.
چرا خط ۷۳ و خط ۷۴ دو خط جدا هستند و
entry = ttk.Entry(...).grid(...)نوشته نشده؟نمایش جواب
چون
gridمقدارNoneبرمیگرداند وentryبرابرNoneمیشد.متغیر
rowدر حلقهی خط ۷۱ چه مقدارهایی میگیرد؟نمایش جواب
۰، ۱، ۲ و ۳ — برای هر جعبهی فرم یکی، از
enumerate.sticky='e'در خط ۷۲ چه کار میکند؟نمایش جواب
برچسب را به سمت شرق (راست) خانهی شبکه میچسباند.
متد
Shop.__init__کی اجرا میشود؟نمایش جواب
یک بار، در خط ۶۵، وقتی
shop = Shop()شیء را میسازد.