یکی از ویجتهای محبوب و به درد بخور در طراحی رابط گرافیکی کاربر، Scale است که ممکن است به نام اسلایدر slider هم شناخته شود. شکل ظاهری این ویجت به شکل زیر است:

scale

کاربر می تواند دستگیره را جابه جا کند و مقدار دلخواه را انتخاب کند. برنامه ای را در زیر می بینید که در آن دو scale عمودی و افقی قرار داده شده و وقتی کاربر هر کدام را تغییر می دهد، مقدار آن در لیبل متناظر نمایش داده می شود.

import tkinter as tk
from  tkinter import *
root=tk.Tk()
root.geometry("600x350")
root.resizable(False,False)
def Xchanged(none):
    xx=sclX.get()    
    lblX.configure(text="X: " + str(xx))
def Ychanged(none):
    yy=sclY.get()    
    lblY.configure(text="Y: " + str(yy))
dblX=DoubleVar()
dblY=DoubleVar()
lblX=Label(root, text="X:" )
lblX.place(height=50,width=50,x=50,y=50)
lblY=Label(root, text="Y:" )
lblY.place(height=50,width=50,x=50,y=100)
sclX=Scale(root, label='X:', from_=0, to=100, variable=dblX, tickinterval=5, length=500, showvalue=0, resolution=5, orient=HORIZONTAL, command=Xchanged)
sclX.place(x=10,y=230)
sclY=Scale(root, label='Y:', from_=0, to=100, variable=dblY, tickinterval=10, length=200, orient=VERTICAL, command=Ychanged)
sclY.place(x=500,y=40)
root.mainloop()

توضیح برنامه:

طبق معمول در خطوط 1 تا 5 کتابخانه tkinter را احضار و پنجره اصلی را ایجاد می کنیم. سپس دو تابع به نام Xchanged و Ychanged تعریف شده که بعدا به توضیح آنها خواهیم پرداخت.

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

خطوط 14 تا 17 مربوط به ایجاد و جانمایی لیبل هایی است که قرار است مقادیر مربوط به اسکیل ها را نمایش دهند.

در خط 18 یک اسکیل افقی به نام sclX ایجاد کرده ایم. عنوانی که در کنار اسکیل نمایش داده می شود X: است. سپس با استفاده از ویژگی from_ مشخص کرده ایم که عدد ابتدایی اسکیل 0 است و با ویژگی to عدد انتهایی آن را 100 تعیین نموده ایم. سپس متغیر dblX را که قبلا تعریف کرده ایم به عنوان متغیر این اسکیل معین می کنیم. ویژگی بعدی tkinterval است که ما آن را برابر 10 قرار داده ایم و با این کار اعدادی که زیر محور ویجت نمایش داده می شوند فاصله 10 تایی دارند.

طول این ویجت با استفاده از length برابر 500 پیکسل تعیین شده است.

یک ویژگی دیگر این ویجت showvalue است که به صورت پیش فرض 1 است و اگر 0 باشد مقدار حال حاضر اسکیل کنار دستگیره نشان داده نمی شود. سپس ویژگی resolution را برابر 5 قرار داده ایم که باعث می شود با تغییر مکان دستگیره مقدار اسکیل 5 تا 5 تا کم یا زیاد شود.

برای اینکه مشخص کنیم جهت اسکیل افقی باشد ویژگی orient را برابر HORIZONTAL قرار می دهیم. و در آخر تابع Xchanged را به این ویجت اختصاص می دهیم تا با هر تغییر در مقدار اسکیل ، این تابع فراخوانی و اجرا شود.

در اینجا می توانیم به تابع Xchanged که در خط 6 تا 8 تعریف کردیم برگردیم و عملکرد آن را توضیح بدهیم. در این تابع ابتدا با استفاده از دستور sclX.get() مقدار فعلی اسکیل را در یک متغیر محلی به نام xx می ریزیم و در خط بعدی آن را در لیبل lblX نمایش می دهیم.

ممکن است توجه کرده باشید که این بار در تعریف تابع به جای اینکه در خط 6 یک جفت پرانتز خالی داشته باشیم، عبارت none نوشته شده است. علت این است که اگر این پرانتز خالب باشد ممکن است موقع تغییر مقدار اسکیل با چنین خطایی مواجه شویم:

TypeError: Xchanged() takes 0 positional arguments but 1 was given

در خط بعدی مکان این ویجت مشخص گردیده است.

در خط 20 با روشی مشابه یک اسکیل عمودی به نام sclY ایجاد کرده ایم که متن نمایش داده شده در کنار آن Y: است. متغیری که برای ذخیره مقدار این اسکیل تعیین شده dblY است. با استفاده از tkinterval فاصله اعداد نمایش داده شده کنار محور این ویجت را برابر 20 تعیین کرده ایم. طول اسکیل را 200 پیکسل مشخص نموده ایم و با سپس ویژگی orient را برابر VERTICAL قرار می دهیم تا اسکیل عمودی شود.

با توجه به اینکه ویژگی resolution را در این اسکیل تعیین نکرده ایم مقدار آن به صورت پیش فرض برابر 1 در نظر گرفته می شود و بنابراین تغییرات مقدار این اسکیل یکی یکی خواهد بود.

در پایان تابع Ychanged را به عنوان تابعی معرفی می کنیم که قرار است با تغییر مقدار این اسکیل فراخوانی و  اجرا شود و در خط بعد مکان این ویجت را مشخص کرده ایم.

در آخرین خط برنامه هم حلقه اصلی رابط کاربری قررا دارد.

با اجرای برنامه و تغییر مکان دستگیره اسکیل ها می بینید که عدد مربوط به هر کدام در لیبل مربوط به آنها نمایش داده می شود:

scale

همان طور که در تصویر می بینید در اسکیل عمودی مقدار فعلی در کنار دستگیره نمایش داده می شود. اما در مورد اسکیل افقی این طور نیست. علت این مساله تعیین مقدار 0 برای ویژگی showvalue برای اسکیل افقی است که قبل توضیح داده شد.

آموزشهای ابزار طراحی GUI در پایتون: tkinter