ابزارهای اصلی (Widgets)

اصلاح شده

2026-09-23

برچسب

برچسب یا Label برای نمایش متن در پنجره استفاده می‌شود. می‌توان ظاهر آن مثل فونت، رنگ پس‌زمینه و رنگ متن را تغییر داد.

import tkinter as tk

window = tk.Tk()

window.title("Hello World!")
window.geometry("480x360")

tk.Label(window, text="Hello Mohsen").pack()
tk.Label(
    window,
    text="How are you?",
    font=("Roboto", 18),  # family size
    bg="blue",  # background
    fg="white",  # forground
).pack(pady=10) # padding in y axis

window.mainloop()

دکمه

دکمه یا Button برای انجام یک عمل هنگام کلیک کاربر استفاده می‌شود. با استفاده از پارامتر command می‌توان یک تابع را به دکمه متصل کرد.

import tkinter as tk


def btn_print():
    print("Print in Terminal!")
    lbl.configure(text="Print in Tkinter GUI")


window = tk.Tk()
window.title("Hello World!")
window.geometry("480x360")

btn = tk.Button(window)
btn.configure(text="Say hello", command=btn_print)
btn.pack(pady=10)

lbl = tk.Label(window, text="")
lbl.pack(pady=10)

window.mainloop()

ورودی

ویجت Entry برای دریافت ورودی از کاربر استفاده می‌شود. با متد get() می‌توان مقدار واردشده را خواند و بر اساس آن تصمیم‌گیری کرد.

import tkinter as tk


def btn_print():
    name = ntr.get()
    if name == "":
        result.configure(
            text="Please Enter your name!",
            fg="red"
        )
    else:
        result.configure(
            text=f"Hello {name}!",
            fg="blue"
        )


window = tk.Tk()
window.title("Hello World!")
window.geometry("480x360")

lbl = tk.Label(
    window,
    text="Enter your name:",
    font=("Roboto", 10)
)
lbl.pack(pady=10)

ntr = tk.Entry(window)
ntr.pack(pady=5)

btn = tk.Button(window)
btn.configure(text="Say hello", command=btn_print)
btn.pack()

result = tk.Label(
    window,
    text="",
    font=("Roboto", 12, "bold")
)
result.pack(pady=10)

window.mainloop()

دکمه رادیویی

ویجت Radiobutton برای انتخاب یکی از چند گزینه استفاده می‌شود. همه‌ی رادیوباتن‌هایی که یک متغیر مشترک دارند به‌صورت خودکار وابسته به هم می‌شوند (انتخاب یکی، بقیه را غیرفعال می‌کند).

import tkinter as tk


def btn_print():
    result.configure(
        text=f"You selected: {gender.get()}"
    )


window = tk.Tk()
window.title("Hello World!")
window.geometry("480x360")

gender = tk.StringVar(value="male")  # shared variable

tk.Radiobutton(
    window,
    text="Male",
    variable=gender,
    value="male",
).pack()
tk.Radiobutton(
    window,
    text="Female",
    variable=gender,
    value="female",
).pack()

btn = tk.Button(
    window,
    text="Submit",
    command=btn_print,
)
btn.pack(pady=10)

result = tk.Label(window, text="")
result.pack(pady=10)

window.mainloop()

چک‌باکس

ویجت Checkbutton برای انتخاب گزینه‌هایی استفاده می‌شود که می‌توانند به‌صورت مستقل (چندتایی) انتخاب یا غیرفعال شوند. با متغیر IntVar مقدار ۰ یا ۱ (تیک‌نخورده / تیک‌خورده) نگه‌داری می‌شود.

import tkinter as tk


def btn_print():
    if agree.get() == 1:
        result.configure(
            text="You agreed!",
            fg="green",
        )
    else:
        result.configure(
            text="You must agree first!",
            fg="red",
        )


window = tk.Tk()
window.title("Hello World!")
window.geometry("480x360")

agree = tk.IntVar()  # 0 = unchecked, 1 = checked

chk = tk.Checkbutton(
    window,
    text="I agree to the terms",
    variable=agree,
)
chk.pack(pady=10)

btn = tk.Button(
    window,
    text="Submit",
    command=btn_print,
)
btn.pack()

result = tk.Label(window, text="")
result.pack(pady=10)

window.mainloop()

لیست‌باکس

ویجت Listbox برای نمایش یک لیست از آیتم‌ها و انتخاب یک یا چند مورد از بین آن‌ها استفاده می‌شود. با متد curselection() اندیس آیتم انتخاب‌شده و با get() مقدار آن خوانده می‌شود.

import tkinter as tk


def btn_print():
    # returns a tuple of indexes
    selection = lst.curselection()
    if selection:
        index = selection[0]
        result.configure(
            text=f"You selected: {lst.get(index)}"
        )


window = tk.Tk()
window.title("Hello World!")
window.geometry("480x360")

lst = tk.Listbox(window)
lst.pack(pady=10)

fruits = [
    "Apple", "Banana",
    "Cherry", "Melon",
]
for fruit in fruits:
    # add item to the end of the list
    lst.insert(tk.END, fruit)

btn = tk.Button(
    window,
    text="Select",
    command=btn_print,
)
btn.pack()

result = tk.Label(window, text="")
result.pack(pady=10)

window.mainloop()

اسلایدر

ویجت Scale یک نوار لغزنده برای انتخاب یک عدد در یک بازه‌ی مشخص است. با پارامترهای from_ و to بازه و با orient جهت افقی یا عمودی آن مشخص می‌شود.

import tkinter as tk


def slider_changed(value):
    result.configure(
        text=f"Value: {value}"
    )


window = tk.Tk()
window.title("Hello World!")
window.geometry("480x360")

scale = tk.Scale(
    window,
    from_=0,
    to=100,
    orient="horizontal",  # or "vertical"
    command=slider_changed,
)
scale.pack(pady=10)

result = tk.Label(
    window,
    text="Value: 0",
)
result.pack(pady=10)

window.mainloop()

قاب (Frame)

ویجت Frame یک ظرف (container) خالی است که برای دسته‌بندی و سازمان‌دهی سایر ویجت‌ها داخل پنجره استفاده می‌شود. مثلاً می‌توان چند ویجت را در یک قاب کنار هم و چند ویجت دیگر را در قاب دیگری زیر هم چید.

import tkinter as tk

window = tk.Tk()
window.title("Hello World!")
window.geometry("480x360")

top_frame = tk.Frame(window)
top_frame.pack(pady=10)

tk.Label(
    top_frame,
    text="Name:",
).pack(side="left", padx=5)
tk.Entry(
    top_frame
).pack(side="left")

bottom_frame = tk.Frame(window)
bottom_frame.pack(pady=10)

tk.Button(
    bottom_frame,
    text="OK",
).pack(side="left", padx=5)
tk.Button(
    bottom_frame,
    text="Cancel",
).pack(side="left", padx=5)

window.mainloop()

جعبه پیام

ماژول messagebox برای نمایش پیام‌های هشدار، خطا یا سوال به‌صورت یک پنجره‌ی جداگانه (Popup) استفاده می‌شود.

import tkinter as tk
from tkinter import messagebox


def btn_print():
    answer = messagebox.askyesno(
        "Confirm", "Are you sure?"
    )
    if answer:
        messagebox.showinfo(
            "Result", "You clicked Yes!"
        )
    else:
        messagebox.showwarning(
            "Result", "You clicked No!"
        )


window = tk.Tk()
window.title("Hello World!")
window.geometry("480x360")

btn = tk.Button(
    window,
    text="Click me",
    command=btn_print,
)
btn.pack(pady=20)

window.mainloop()

متن چندخطی

ویجت Text برای دریافت یا نمایش چند خط متن استفاده می‌شود (برخلاف Entry که فقط یک خط است). با متد get("1.0", tk.END) تمام متن از خط اول تا انتها خوانده می‌شود.

import tkinter as tk


def btn_print():
    # from line 1, char 0 to the end
    content = txt.get("1.0", tk.END)
    print(content)


window = tk.Tk()
window.title("Hello World!")
window.geometry("480x360")

txt = tk.Text(
    window,
    height=8,
    width=40,
)
txt.pack(pady=10)

btn = tk.Button(
    window,
    text="Print",
    command=btn_print,
)
btn.pack()

window.mainloop()

تمرین

احتیاطگوسفند شمار

دینا کوچولو که خوابش نمیبره مادرش بهش یاد داده قبل خواب توی ذهنش گوسفندهایی رو تصور کنه که از روی نرده رد میشن و سعی کنه تعداد اونهارو بشماره تا ذهنش خسته بشه بخوابه. اما دینا که تازه برنامه نویسی یاد گرفته بود به فکر این بود که چطور یک نرم افزار گوسفند شمار بسازه. دینا رو برای ساخت این نرم افزار راهنمایی کنید.

کد
from tkinter import *

counter = 0

def btn_counter():
    global counter
    counter += 1
    lbl.configure(text=f"{counter} x 🐑.")

window = Tk()
window.title("Sheep counter")
window.geometry("480x360")

btn = Button(window)
btn.configure(text="count", command=btn_counter)
btn.pack(pady=10)

lbl = Label(window, text="0 x 🐑.")
lbl.pack(pady=10)

window.mainloop()