Spinbox

عنصر Spinbox عموماً برای دریافت اعداد از ورودی و محدود کردن کاربران برای وارد کردن مقادیر غیرعددی بکار می‌رود. عنصر Spinbox از لحاظ شکل ظاهری شبیه به عنصر Entry است، با این تفاوت که دکمه‌هایی به شکل پیکان در سمت چپ یا راست آن برای افزایش و یا کاهش مقدار کنترل وجود دارند:
spinbox-in-tkinter-01
نحوه ایجاد Spinbox به صورت زیر است:

Spinbox (master, option, ...)

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

تنظیمات شرح
activebackground رنگ پس زمینه زمانی که نشانگر ماوس بر روی آن قرار می‌گیرد.
bd پهنای خط حاشیه عنصر. مقدار پیش فرض 2 است.
bg رنگ پس زمینه عنصر در حالت عادی
command تابعی که هنگام فشرده شدن دکمه‌ها و یا تغییر مقدار spinbox فراخوانی می‌شود.
cursor شکل نشانگر ماوس زمانی که ماوس بر روی این عنصر قرار می‌گیرد.
disabledbackground رنگ پس زمینه زمانی که عنصر در حالت disabled باشد.
disabledforeground رنگ پیش زمینه زمانی که عنصر در حالت disabled باشد.
fg رنگ متن
font فونت متن استفاده شده در این عنصر را تعین می‌کند.
format نوع قالب بندی عدد را مسخض می‌کند (بدون مقدار پیش فرض).
from_ مقدار کمینه برای Spinbox. به همراه گزینه to برای محدود کردن بازه مقادیر مجاز استفاده می‌شوند.
justify برای ترازبندی متن به کار می‌رود. پیش فرض LEFT است.
relief افکت اطراف عنصر را مشخص می‌کند (مقدار پیش فرض SUNKEN است).
repeatdelay مشخص می‌کند چه مدت زمان دکمه ماوس باید پایین نگه داشته شود تا مقدار Spinbox شروع به تغییر کند. واحد آن میلی ثانیه است.
repeatinterval در هنگام پایین نگه داشتن دکمه ماوس بر روی دکمه‌ها، فاصله زمانی تغییر مقدار Spinbox را مشخص می‌کند. واحد آن میلی ثانیه است.
state وضعیت فعال، غیر فعال بودن و … Spinbox را تعیین و یکی از مقادیر NORMAL،DISABLED یا “readonly” را دریافت می‌کند (مقدار پیش فرض NORMAL است).
textvariable همراه با یک متغیر کنترلی به کار رفته و و مقدار وروردی را در خود ذخیره می‌کند.
to به گزینه from_ مراجعه کنید.
validate نحوه اعتبار سنجی (بدون مقدار پیش فرض)
validatecommand تابع اعتبار سنجی (بدون مقدار پیش فرض)
values یک Tuple شامل مقادیر مجاز برای این عنصر. جایگزین from/to/increment است.
vcmd همانند گزینه validatecommand است.
width پهنای عنصر بر اساس تعداد حروف. پیش فرض 20 است.
wrap اگر مقدار آن true باشد، مقدار Spinbox به صورت حلقوی تغییر می‌کند. پس از انتهای بازه به ابتدای بازه منتقل می‌شود و بر عکس.
xscrollcommand برای اتصال Spinbox به اسکرول بار افقی استفاد می‌شود. این گزینه باید به تابع set اسکرول بار مربوطه نسبت داده شود.

عنصر Spinbox دارای توابع زیر است:

تابع شرح
delete(startindex [,endindex]) حرف یا یک دنباله‌ای از متن مشخص شده را از عنصر حذف می‌کند.
()get مقدار فعلی عنصر را باز می‌گرداند.
identify(x, y) نوع element را در مکان داده شده مشخص می‌کند. مقدار بازگشتی یکی از مقادیر “none”،“buttondown”،“buttonup”،“entry” خواهد بود.
index(index) موقعیت عددی index داده شده را بر می‌گرداند.
insert(index [,string]…) رشته string را در مکان index اضافه می‌کند.
invoke(element) دکمه Spinbox را فراخوانی می‌کند. مقدار element باید یکی از مقادیر “buttonup” یا “buttondown” باشد.

حال می‌خواهیم یک برنامه بسازیم که کنترل Spinbox در آن بکار رفته باشد. به کد زیر توجه کنید:

 1: import tkinter
 2: from tkinter import *
 3: from tkinter import messagebox
 4:
 5: window = tkinter.Tk()
 6: window.geometry('220x200')
 7:
 8: price           = Label  (window, text= "price")
 9: SpinboxPrice    = Spinbox(window, from_=0, to=10000, format="%.2f", increment=0.50)
 10: quantity        = Label  (window, text= "quantity")
 11: SpinboxQuantity = Spinbox(window, from_=0, to=100)
 12: 
 13: button          = Button (window, text= 'Calculate')
 14:
 15: price.grid          (row= 0)
 16: SpinboxPrice.grid   (row= 0, column= 1)
 17: quantity.grid       (row= 1)
 18: SpinboxQuantity.grid(row= 1, column= 1)
 19:
 20: button.grid         (row= 3, column= 1, sticky= W, pady= 4)
 21:
 22: def calculate(event):
 23: total = (float(SpinboxPrice.get()) * int(SpinboxQuantity.get()))
 24: messagebox.showinfo('', "The total price is {0}".format(str(total)))
 25:
 26: button.bind('<Button-1>', calculate)
 27:
 28: window.mainloop()

در کد بالا، یک فرم را ایجاد کرده و دو برچسب (lable) و دو کنترل Spinbox بر روی آن قرار داده‌ایم (خطوط 11-8 و 18-15). مقدار خاصیت format کنترل Spinbox برابر با %.2f قرار داده شده، بنابراین این کنترل می‌تواند 2 رقم اعشار دقت داشته باشد (خط 9). مقدار خاصیت increment نیز برابر با 0.50 قرار داده‌ایم، بنابراین افزایش و یا کاهش مقدار به اندازه 0.50 واحد کم یا زیاد می‌شود. مقدار خاصیت to برابر 10000 است، پس قیمت (Price) به آن محدود می‌شود و کاربر نمی‌تواند رقمی بالاتر از آنرا وارد کند.

از آنجاییکه نهایت مقدار کنترل SpinboxQuantity را در جدول بالا 100 قرار داده‌ایم، در نتیجه شما می‌توانید فقط مقادیری نهایتاً تا 100 را در آن وارد کنید. برنامه را اجرا کنید. مقدار کنترل SpinboxPrice را به وسیله‌ی دکمه‌های پیکانی کاهش یا افزایش دهید. مشاهده می‌کنید مقدار آن به اندازه 0.50 واحد افزایش و یا کاهش پیدا می‌کند. در خط 13 یک کنترل دکمه ایجاد کرده و در خط 20 آن را روی فرم قرار داده‌ایم.

در 24-22 یک کنترل کننده رویداد ایجاد کرده که کار آن این است که مقدار موجود در هم ضرب می‌کند. در خط 23 ما مقادیر موجود در SpinboxPrice و SpinboxQuantity را با استفاده از متد ()get به دست می‌آوریم. چون این متد یک رشته را بر می‌گرداند ما مجبوریم مقادیر به دست آمده را جهت عملیات ضرب، به نوع float و int تبدیل کنیم (خط 23). سپس در خط 24 نتیجه عملیات را نمایش دهیم. حال این کنترل کننده رویداد را به رویداد کلیک دکمه در خط 26 وصل می‌کنیم. بر روی دکمه‌ی Calculate کلیک کنید، این دکمه با ضرب کردن مقدار Quantity در Price، قیمت کل را بدست می‌آورد:
spinbox-in-tkinter-02