Entry

عنصر Entry ابتدایی‌ترین وسیله برای ورود اطلاعات در یک فرم ویندوزی می‌باشد. این کار را با تایپ آنها (اطلاعات) در Entry انجام می‌دهید. متنی که شما تایپ می‌کنید، به وسیله متد ()get این عنصر، قابل دسترسی است. این عنصر برای دریافت یک رشته متن تک خطی از کاربر استفاده می‌شود. نحوه ایجاد این عنصر به صورت ساده به شکل زیر است:

Entry( master, option, ... )

master، بیانگر پنجره والدی است که این دکمه به آن تعلق خواهد داشت و option، تنظیمات پرکاربرد برای Entry می‌باشند، که می‌توانند به صورت زوج‌های کلید/مقدار که با ویرگول از هم جدا می‌شوند، مورد استفاده قرار گیرند. در جدول زیر لیست این تنظیمات آمده است:

تنظیمات شرح
bg رنگ پس زمینه عنصر، در حالت عادی را مشخص می‌کند.
bd اندازه خط حاشیه عنصر را مشخص می‌کند (پیش فرض 2 پیکسل).
cursor با انتساب یکی از نام‌های نشانگر ماوس (arrow ،dot و …) برای این گزینه، زمانی که ماوس بر روی این عنصر قرار گیرد، نشانگر ماوس به الگوی مشخص شده، تغییر می‌یابد.
font فونتی که برای متن استفاده می‌شود، را تعیین می‌کند.
exportselection در حالت پیش فرض متنی که درون Entry انتخاب می‌شود، به صورت خودکار به کلیپ بورد منتقل می‌شود. برای ممانعت از این عمل exportselection را صفر قرار دهید.
fg رنگ متن را مشخص می‌کند.
highlightcolor رنگ فوکوس، زمانی که Entry دارای فوکوس است.
justify اگر متن شامل چند خط باشد، این گزینه نحوه تراز کردن متن را کنترل می‌کند (LEFT،CENTER و RIGHT).
relief مقدار پیش فرض FLAT است، که باعث می‌شود، کناره عنصر، نسبت به پس زمینه خود، برجسته نشود. می‌توانید این گزینه را به سبک‌های دیگر تغییر دهید.
selectbackground رنگ پس زمینه متن انتخاب شده، را تعیین می‌کند.
selectborderwidth پهنای خطی که در اطراف متن انتخاب شده کشیده می‌شود را مشخص می‌کند (پیش فرض 1 پیکسل).
selectforeground رنگ متن انتخاب شده را، تعیین می‌کند.
show در حالت عادی حروفی که کاربر تایپ می‌کند، درون باکس نمایش داده می‌شود. برای ایجاد جعبه پسورد که به جای هر حرف، علامت * نشان می‌دهد، مقدار ‘*’ = show قرار دهید.
state وضعیت Entry است. مقدار پیش فرض NORMAL است. مقادیر دیگر آن DISABLED و readonly است.
textvariable برای به دست آوردن مقدار فعلی Entry باید این گزینه را به یک متغییر کنترلی از نوع StringVar انتساب دهید.
width پهنای Entry را بر اساس تعداد حروف مشخص می‌کند. تنها اندازه Entry در صفحه را کنترل می‌کند و تاثیری بر حداکثر طول متن وارد شده ندارد.
xscrollcommand اگر اغلب اوقات کاربر متن طولانی‌تری از اندازه Entry وارد می‌کند، می‌توانید Entry را با این گزینه به یک اسکرول بار افقی متصل کنید.

توابع پرکاربرد برای این عنصر هم عبارتند از :

تابع شرح
delete(first, last=None) کاراکترها را از Entry حذف می‌کند. از کارکتری که در موقعیت first است، شروع می‌کند و تا حرف قبل از موقعیت last را پاک می‌کند. اگر پارامتر دوم ارسال نگردد، تنها حرف در موقعیت first حذف می‌شود.
()get متن فعلی Entry را به صورت یک رشته بر می‌گرداند.
icursor(index) نشانگر درج را، قبل از حرف در موقعیت index، قرار می‌دهد.
index(index) متن درون Entry را به گونه‌ای جا به جا می‌کند تا حرف در موقعیت index، سمت چپ‌ترین حرف قابل مشاهده باشد. اگر کل متن به صورت کامل درون Entry جا گرفته باشد، این تابع تاثیری نخواهد داشت.
insert(index, s) رشته s را، قبل از حرف در موقعیت index، درج می‌کند.
select_adjust(index) این تابع برای اطمینان از اینکه حرف در موقعیت index هم انتخاب شده باشد، استفاده می‌شود.
()select_clear متن انتخاب شده را از حالت انتخاب خارج می‌کند.
select_from(index) شروع انتخاب را در موقعیت index قرار می‌دهد و حرف مورد نظر را نیز انتخاب می‌کند.
()select_present اگر متنی انتخاب شده باشد، True بر می‌گرداند، در غیر اینصورت False بر می‌گرداند.
select_range(start,end) متن را از موقعیت start تا قبل از مکان end انتخاب می‌کند. start باید کمتر از end باشد.
select_to(index) همه متن را تا قبل از حرفی که در موقعیت index قرار دارد، انتخاب می‌کند.
xview(index) در زمانی که Entry به اسکرول بار متصل است، برای مشاهده شدن متن در موقعیت index، در صورت نیاز عمل اسکرول را انجام می‌دهد.
xview_scroll(number,what) برای اسکرول کردن Entry به صورت افقی استفاده می‌شود. ورودی what باید یا مقدار UNITS (اسکرول به اندازه پهنای حرف) یا PAGES (اسکرول به میزان اندازه Entry) داشته باشد. مقدار مثبت number از سمت چپ به راست اسکرول می‌کند. مقدار منفی آن از راست به چپ.

در مثال زیر نحوه استفاده از Entry نشان داده شده است :

  1: import tkinter
  2: from tkinter import *
  3: 
  4: window = tkinter.Tk()
  5: window.geometry('220x200')
  6: 
  7: firstNumber  = Label (window, text= "firstNumber")
  8: firstEntry   = Entry (window)
  9: secondNumber = Label (window, text= "secondNumber")
 10: secondEntry  = Entry (window)
 11: Sum          = Label (window, text= "", anchor="w", width=18)
 12: button       = Button(window, text= 'Calculate')
 13: 
 14: firstNumber .grid(row= 0)
 15: firstEntry  .grid(row= 0, column= 1)
 16: secondNumber.grid(row= 1)
 17: secondEntry .grid(row= 1, column= 1)
 18: Sum         .grid(row= 2, column= 1)
 19: button      .grid(row= 3, column= 1, sticky= W, pady= 4)
 20: 
 21: def calculateSum(event):
 22:     total = sum(int(entry.get()) for entry in (firstEntry, secondEntry))
 23:     Sum.config(text="Sum = %s" % total)
 24: 
 25: button.bind('<Button-1>', calculateSum)
 26: 
 27: window.mainloop()
 28: button.mainloop()

برنامه از شما می‌خواهد که دو عدد را وارد کنید و با زدن دکمه جمع آنها را با استفاده از یک برچسب (Label) به شما نشان می‌دهد. در خطوط 10-7 کد بالا دو عنصر Entry را بر روی فرم اصلی برنامه و در جلوی هر کدام نیز دو عنصر Label که نشان دهنده هدف آنهاست (Entry ها) قرار داده‌ایم. در خط 11 یک کنترل lable دیگر برای نشان دادن حاصل جمع دو عدد و یک دکمه Button هم برای انجام عملیات ایجاد شده است. در خطوط 19-14، از متد ()grid برای قرار دادن عناصر در سطرها و ستون های مختلف یا به عبارتی برای چیدن عناصر استفاده کرده ایم. نمای کلی برنامه به صورت زیر است:
entry-in-python-01
در خطوط 23-21 کد بالا یک تابع به نام ()calculateSum تعریف کرده‌ایم، در بدنه تابع و در خط 22 گفته‌ایم که مقادیر داخل Entry به وسیله تابع ()get گرفته شود، سپس با استفاده از تابع ()int به نوع صحیح تبدیل و در نهایت به وسیله تابع ()sum با هم جمع شوند. در خط 23 هم جمع مقادیر در داخل خاصیت text مربوط به Label نمایش داده شود. به مثالی دیگر توجه کنید:

  1: import tkinter
  2: from tkinter import *
  3: 
  4: window = tkinter.Tk()
  5: window.geometry('220x200')
  6: 
  7: var = StringVar()
  8: entry = Entry(window, textvariable=var)
  9: label = Label(window, textvariable=var)
 10: entry.pack()
 11: label.pack()
 12: 
 13: def TextChange(event):
 14:     var.set(entry.get())
 15: 
 16: entry.bind('<Key>', TextChange)
 17: 
 18: window.mainloop()

قبل از توضیح کد بالا، ابتدا در مورد یک نوع کلاس در tkinter به شما توضیح می دهیم. در Tkinter انواع خاصی از کلاس‌ها وجود دارند که به control variable معروف هستند و همانند متغیرهای معمولی عمل می‌کنند و می‌توانند مقادیری مانند رشته‌ها و اعداد و … را در خود ذخیره کنند.
یک ویژگی منحصر به فرد این متغیرها است که می‌توانند بین چند عنصر Tkinter به اشتراک گذاشته شوند و وضعیت همه عناصر را به خاطر بسپارند. بدین معنی که اگر فرضاً یک مقدار را در داخل این متغیرها ذخیره کنید، با تغییر این مقدار، تمام عناصری که از این متغیر استفاده می‌کنند، به روز می‌شوند. control variable ها چهار نوع هستند:

  • BooleanVar
  • DoubleVar
  • IntVar
  • Stringvar

همانطور که از نام آنها پیداست، این کلاس‌ها می‌توانند انواع منطقی، اعشاری، صحیح و رشته‌ای را در خود ذخیره کنند. این متغیرها یا کلاس‌ها دارای دو متد به نام‌های ()set و ()get هستند که از اولی برای مقداردهی به آنها و از دومی برای گرفتن مقدار آنها استفاده می‌شود. برای درک بهتر کاربرد این کلاس‌ها و متدهای آنها، به توضیح کد بالا می‌پردازیم. کار کد بالا این است که ما هر چه را که در داخل عنصر Entry می نویسیم، عینا و به طور همزمان در داخل عنصر Label نوشته می شود. اما این کار را چگونه انجام می دهیم.

ابتدا در خط 7 یک نمونه از کلاس StringVar را ایجاد کرده ایم و آن را در خطوط 8 و 9 به خاصیت textvariable دو عنصر Entry و Label اختصاص داده ایم. این کار باعث می شود که وضعیت این دو عنصر به وسیله کلاس StringVar به خاطر سپرده شود و هر تغییر در خاصیت textvariable هر یک از عناصر به دیگری هم اعمال شود. پس تا اینجا ما دو عنصر را به هم متصل کردیم. حال چطور متغیر یا کلاس StringVar را مقدار دهی کنیم تا این مقدار به دو عنصر اعمال شود. اینکار را در خط 14 و با استفاده از متد ()set انجام داده ایم.

در داخل پرانتزها نوشته ایم که مقداری که در داخل عنصر Entry نوشته می شود را با استفاده از متد ()get گرفته و سپس با استفاده از متد ()set در داخل متغیر var قرار بده. این عمل را به صورت یک کنترل کننده رویداد نوشته تا بتوانیم آن را به رویداد <Key> اختصاص دهیم. در کل معنای خطوط 16-13 این است که مقادیری که توسط کاربر به وسیله صفحه کلید و در داخل عنصر Entry تایپ می شود را در داخل متغیر var قرار بده. و چون این متغیر را در خطوط 8 و 9 به خاصیت textvariable اختصاص داده ایم، هر چیزی که در داخل عنصر Entry نوشته می شود، همزمان در داخل عنصر Label هم نوشته می شود. حالا برنامه را اجرا کرده و هر چیزی را که می‌خواهید درون Entry بنویسید. مشاهده می‌کنید که هر چیزی که شما درون Entry می‌نویسید دقیقاً به همان صورت بر روی Label نوشته می‌شود:
entry-in-python-02
اگر Entry شما می‌خواهد یک پسورد را بپذیرد، شما باید مقدار خاصیت show را به چیزی مانند * تغییر دهید (این کاراکتر بسته به سلیقه‌ی شما می‌تواند هر چیزی باشد):

entry = Entry(window, show='*')

وقتی که کاربر یک حرف را وارد کند این کاراکتر (*) به او نمایش داده می‌شود. به شکل زیر دقت کنید:
entry-in-python-03