Spinbox
عنصر Spinbox عموماً برای دریافت اعداد از ورودی و محدود کردن کاربران برای وارد کردن مقادیر غیرعددی بکار میرود. عنصر Spinbox از لحاظ شکل ظاهری شبیه به عنصر Entry است، با این تفاوت که دکمههایی به شکل پیکان در سمت چپ یا راست آن برای افزایش و یا کاهش مقدار کنترل وجود دارند:
نحوه ایجاد 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، قیمت کل را بدست میآورد: