ویجت spinbox

یکی از ویجتهایی که کاربر می تواند یکی از چند آیتم موجود را از آن انتخاب کند spinbox است. این ویجت مثل combobox و listbox قابلیت نشان دادن همه آیتمها را ندارد، بلکه کاربر با استفاده از دو پیکان کناری می تواند بین آیتمها یکی را انتخاب کند. در زیر برنامه ای نوشته ایم که به کاربر این امکان را می دهد سن خود را بین 18 تا 99 سال انتخاب نماید.

برنامه را در زیر می بینید:

import tkinter as tk
from  tkinter import *
root=tk.Tk()
root.geometry("300x200")
root.resizable(False,False)
root.title('spinbox karakit')
def agechanged():
    lblAge.configure(text="Your age is: " + spnAge.get() + " years")
intAge=IntVar
spnAge=Spinbox(root, from_=18, to = 99 ,textvariable=intAge, command=agechanged)
spnAge.place(height=20,width=50,x=110,y=80)
lblAge=Label(root, text="How old are You?")
lblAge.place(height=20,width=120,x=100,y=40)
root.mainloop()

بعد از اجرای برنامه پنجره زیر نمایش داده می شود:

spinbox

با تغییر سن ، متن یک لیبل متناسب با انتخاب کاربر تغییر می کند:

spinbox

توضیح برنامه

خطوط 1 تا 6 مربوط به احضار کتابخانه های مورد نیاز و ایجاد پنجره اصلی هستند.

در خط 7 و 8 یک تابع به نام agechanged تعریف کرده ایم که بعدا به توضیح آن می پردازیم.

در خط بعدی یک متغیر مخصوص tkinter به نام intAge تعریف کردیه ایم که بعدا قرار است سن کاربر داخل آن ذخیره شود.

در خط 10 یک ویجت spinbox با نام spnAge تعریف و مقادیر داخل آن را از عدد 18 تا عدد 99 تعیین نموده ایم و متغیر مرتبط با این ویجت را همان intAge که در خط قبل تعریف شد ، تعیین کرده ایم. تابعی که با تغییر آیتم این ویجت فراخوانی می شود نیز agechanged است.

در تابع agechanged که در خط 7 و 8 تعریف شده، مقدار فعلی متغیر مرتبط با spinbox که در واقع همان intAge هست، با دستور get استخراج می شود و با متن دیگری ترکیب و در لیبل lblAge نمایش داده می شود. این لیبل در خطوط 12 و 13 تعریف و جاگذاری شده است.

تعیین مقادیر spinbox با استفاده از لیست

یک روش دیگر برای اینکه آیتمهای داخل spinbox را مشخص کنیم این است که ابتدا یک لیست ایجاد کنیم و بعد در spinbox مقدار values را برابر این لیست تعیین نماییم:

years=list(range(18, 99))
spnAge=Spinbox(root, values=years ,textvariable=intAge, command=agechanged)

نتیجه تفاوتی با حالت قبل نخواهد داشت.

اگر بخواهیم که spinbox به جای مقادیر عددی حاوی مقادیر رشته ای باشد می توانیم مقادیر رشته ای مورد نظر را در یک لیست ذخیره کنید و به spinbox اختصاص دهید.

با اجرای برنامه زیر کاربر می تواند فصل مورد علاقه اش را از spinbox انتخاب کند و یک لیبل متن متناسب را نمایش می دهد:

import tkinter as tk
from  tkinter import *
root=tk.Tk()
root.geometry("300x200")
root.resizable(False,False)
root.title('spinbox karakit')
def seasonchanged():
    lblSeason.configure(text="Your favorite season is: " + spnSeason.get())
strSeason=StringVar
seasons=['Spring','Summer','Autumn','Winter']
spnSeason=Spinbox(root, values=seasons ,textvariable=strSeason, command=seasonchanged)
spnSeason.place(height=20,width=100,x=110,y=80)
lblSeason=Label(root, text="What is your favorite season?")
lblSeason.place(height=20,width=200,x=70,y=40)
root.mainloop()

نتیجه انتخاب یکی از فصل ها را در تصویر زیر می توان دید:

spinbox