برنامه ها از منابع گوناگون مانند ورودی های خط فرمان، پایگاه داده ها، فایل های متنی و دودویی و یا از وب (استخراج داده های وب با وب اسکرپینگ) می توانند داده ها را دریافت کنند. یکی دیگر از ورودی ها، واسطه یا میانجی گرافیکی GUI است. در Tkinter ویجت Entry یک تک بند (خط) ورودی را دریافت می کنند. برای نمونه می توان نام کاربری و گذرواژه را دریافت کند.

دریافت ورودی از کاربر با کلاس Entry

کد زیر یک Entry به نام entry1، یک Label به نام label1 و یک Button به نام button1 را می سازد که می خواهیم با کلیک روی دگمه، نوشته ورودی از Entry در Label نشان داده شود. تابع ()show_input زمانی انجام می شود که روی دگمه کلیک کنیم، بنابراین نام این تابع به پارامتر command در تابع سازنده Button در بند ۲۱ فرستاده شده است. همچنین در متدهای ()pack برای label1 و entry1 سوی TOP و برای button1 سوی BOTTOM را نشان داده ایم.

MessageBox در Tkinter

در کد زیر بدنه تابع ()show_input نشان داده شده است که در آن نخست و به کمک متد ()get از کلاس Entry مقدار وارد شده از Entry را در متغیری به نام input_text نگهداری می کنیم. بنابراین برای دسترسی به مقدار وارد شده از Entry باید متد ()get را فراخوانی کنیم. سپس بررسی می شود که آیا اندازه شمار کاراکترهای رشته ورودی از Entry که در متغیر input_text نگهداری می شود، برابر صفر است یا نه؟ اگر اینگونه باشد، پس یک پیغام خطا به کمک کلاس messagebox و متد ()showinfo نشان داده می شود. ولی اگر چیزی وارد شده باشد، پس آن رشته به متن label1 داده می شود. پیش از این گفتیم برای تغییر متن یک Label اید پارامتر text از متد ()config کلاس Label را مقداردهی کنیم.

در کدهای زیر دو متد از به نام ()showinfo و ()showwarning نشان داده شده اند که هر دو برای نمایش یک پیغام به کار می روند. ناهمسانی این دو در مفهومی است که می خواهیم به کاربر برسانیم. ()showinfo یک چیزی را به کاربر آگاهی می دهد ولی ()showwarning یک خطا را می خواهد بگوید. همچنین آیکون این دو نیز با یکدیگر ناهمسان است. بنابراین شاید بهتر باشد در کد بالا، به جای ()showinfo متد ()showwarning را به کار ببریم. هر دو دو رشته را دریافت کرده اند که رشته یکم، عنوان (Title) پنجره پیغام و دومین رشته، نوشته پیغام را نشان می دهد.

دریافت ورودی از کاربر با کلاس Text

ویجت Entry برای دریافت تک خط از ورودی کاربرد دارد ولی اگر بخواهیم چندین خط مانند یک فایل را بخوانیم یا نمایش دهیم، دیگر Entry کاربردی ندارد و می بایست ویجت دیگری به نام Text را به کار ببریم. برای نمونه شما می خواهید ویرایشگر نوشته (Text Editor) را بسازید، پس Entry کاربردی نیست و می بایست Text را به کار گیرید. نمونه دیگر در فرم هایی است که داده ها از ورودی می گیرد تا آنها در پایگاه داده نگهداری شوند. در اینجا برای ستون های گونه TEXT در پایگاه داده، دیگر نباید در برنامه پایتون از Entry کمک بگیریم، و از این رو باید ویجت Text در میانجی (واسط) گرافیکی باشد.

در کد زیر دو دگمه را ساخته ایم که یکی برای بارگذاری فایل و دیگری برای پاک کردن درون مایه ویجت Text به کار می رود. زمانی که دگمه Show کلیک می شود، تابع ()load_file و زمانی که دگمه Clear کلیک می شود، تابع ()clear انجام خواهد شد. ساخت ویجت Text همانند دیگر ویجت ها است که پارامتر یکم تابع سازنده آن نام متغیری است که به ویجت ریشه ای اشاره دارد که می خواهیم Text بر روی آن چسبانده شود.

تابع ()load_file و درج در ویجت Text با متد ()insert

کاربرد تابع ()load_file این است که درون مایه (محتوای) فایل متغیر filename را بخوانید و سپس همه خط های آن را که در متغیر lines نگهداری می شوند را به ویجت text (از کلاس Text) درج کند. برای درج هر نوشته ای در ویجت Text باید متد ()insert را به کار ببریم. پارامتر یکم آن می تواند یکی از گزینه های زیر باشد. در این نوشته و در تابع ()load_file من از END کمک گرفته ام. پارامتر دوم، همان نوشته ای است که می خواهیم نمایش دهیم که در اینجا همان درون مایه متغیر lines یا خط های فایل متغیر filename است.

تابع ()clear و پاک کردن درون مایه ویجت Text با متد ()delete

کاربرد تابع ()clear این است که درون مایه ویجت Text را پاک می کند. در کد زیر می بینید که درون تابع ()clear این متد از ویجت Text را فراخوانی کرده ایم که پارامتر یکم آن یک شماره اعشاری 1.0 و پارامتر دوم نیز END فرستاده شده است. در دنباله درباره مفهوم واژه END در Tkinter گفته شده است.

  • متد ()get از کلاس Entry برای بدست آوردن نوشته فرستاده شده از ویجت Entry به کار گرفته می شود.
  • اگر بخواهیم نوشته ای را در ویجت Entry یا Text درج کنیم، در هر دو ویجت متدی به نام ()insert هست که پارامتر یکنم آن یکی از اندیس های از پیش آماده شده در Tkinter مانند END و پارامتر دوم آن همان نوشته ای است که می خواهیم درج شود.
  • اگر بخواهیم نوشته ای کنونی درون ویجت Entry را با نوشته ای دیگر جایگزین کنیم یا بخواهیم نوشته کنونی را پاک کنیم، پس باید متد ()delete را به کار ببریم.
  • اگر بخواهیم نوشته درون ویجت Text را پاک کنیم، نیاز به فراخوانی متد ()delete است که آرگومام یکم آن شماره 1.0 و آرگومان دوم آن نام اندیس از پیش آماده END باشد.

اندیس ها و درج نوشته در ویجت Entry و Text

برای درج چه در ویجت Entry و چه در Text، باید متد ()insert را فراخوانی کنیم. پارامتر یکم آن، می تواند یکی از چهار گزینه زیر باشد. همچنین پارامتر دوم، همان نوشته ای است که می خواهیم در ویجت درج شود. برای نمونه، یکی از کاربردهای درج داده در Entry، زمانی است که بخواهیم مقداری از پیش آماده (Default Value) به آن بدهیم.

  • اندیس می تواند شماره باشد که همانند اندیس گذاری لیست ها و تاپل ها، شماره آغازین، صفر خواهد بود. کد زیر دو Entry را نشان می دهد که دو رشته Entry1 و Entry2 در اندیس صفر درج شده اند. شکل زیر، ساختار دو Entry و رشته های درج شده در هر یک را نشان می دهد. بنابراین با توجه به اندیس گذاری، می توانیم بگوییم که بازه 0 تا 5 به کاراکتر نخست رشته درون Entry اشاره دارد.

  • END درست به پس از واپسین نویسه (کاراکتر) درون رشته درون Entry اشاره دارد. برای نمونه برای دسترسی به همه نویسه ها (کاراکترهای) رشته درون Entry می توانیم از بازه 0 تا END کمک بگیریم. در کد زیر به جای اندیس گذاری، از END برای درج یک رشته در Entry کمک گرفته ایم.

هر دو کلاس Entry و Text متد ()insert و ()delete را دارند و اندیس گذاری ها مانند اندیس شماره یا END جدا از این دو متد هستند. توجه کنید که ()insert برای درج یک نوشته (مانند همه بندهای (خط های) یک فایل) و متد ()delete برای پاک کردن همه درون مایه (محتوای) یک Entry یا Text است.