وارد کردن متن توسط ویجت Entry

در این قسمت از آموزش tkinter قصد داریم با ویجتی آشنا شویم که کاربر می تواند مقادیری را در آن وارد کند، نام این ویجت  Entry  است. برنامه می تواند مقادیری را که کاربر در این ویجت وارد می کند دریافت و پردازش های مورد نیاز را روی آن انجام دهد.

برای اینکه ببینیم چطور می شود از این ویجت در برنامه استفاده کرد برنامه ای می نویسیم که کاربر اسمش را وارد می کند و برنامه به او خوش آمد می گوید. به کد زیر نگاه کنید:

import tkinter as tk
from  tkinter import *
root=tk.Tk()
root.geometry("300x220")
root.resizable(False,False)
def clicked():
    lblWelcome.configure(text="Hello " + strName.get())
lblName=Label(root, text="What is your name?")
lblName.place(height=20,width=150,x=0,y=40)
lblWelcome=Label(root, text="Hello World")
lblWelcome.place(height=50,width=100,x=100,y=140)
btn=Button(root, text="Click Me!", command=clicked)
btn.place(height=40,width=100,x=100,y=100)
strName=tk.StringVar()
txtName=tk.Entry(root,textvariable=strName)
txtName.place(height=20,width=80,x=150,y=40)
root.mainloop()

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

مثل قسمتهای قبل در پنجره اصلی را در خطوط 1 تا 5 ایجاد کردیم. اما این بار در خط 1 tkinter را با نام مستعار و کوتاه و دلخواه tk فراخوانی کردیم و در ادامه برنامه هم به جای استفاده از tkinter از همان tk که به آن اختصاص داده ایم استفاده می کنیم.

در خط 6 و 7 تابعی را تعریف کرده ایم به نام clicked که بعدا موقع کلیک روی دکمه فراخوانی می شود. بعدا درباره این تابع توضیح خواهیم داد. در خط 8 لیبلی را تعریف کردیم که موقع اجرای برنامه متن ثابتی را نمایش خواهد داد:


what is your name?

در خط بعدی اندازه و جایگاه این لیبل را تعیین کردیم.

در خط 10 یک لیبل با نام lblWelcome تعریف کردیم که متن اولیه آن Hello World هست. در خط بعد اندازه و جایگاه این لیبل را مشخص کردیم. متن این لیبل قرار است بعدا با کلیک شدن یک دکمه تغییر کند.

در خط 12 دکمه ای به نام btn را تعریف می کنیم که با کلیک روی آن تابع clicked فراخوانی می شود و در خط بعد اندازه و مکان دکمه مشخص شده است.

در خط 14 یک متغیر مخصوص ذخیره مقادیر رشته ای تعریف کردیم به نام strName که مخصوص tkinter هست. در خط 15 یک ویجت entry با نام txtName تعریف می کنیم و تعیین می کنیم که مقادیری که داخل این ویجت نوشته می شوند در همان متغیر strName ذخیره گردند. در خط بعدی اندازه و جایگاه این ویجت مشخص شده و بالاخره در خط آخر طبق معمول حلقه اصلی برنامه قرار دارد.

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

    lblWelcome.configure(text=”Hello ” + strName.get())

با استفاده از configure می توان خصوصیات یک ویجت را تغییر داد و در اینجا می خواهیم خصوصیت text را جوری تغییر دهیم که کلمه Hello در کنار اسم کاربر که در ویجت Entry وارد کرده نمایش داده شود. برای این کار text را برابر این عبارت قرار می دهیم:

“Hello ” + strName.get()

قسمت ثابت Hello داخل گیومه ” ” قرار گرفته و بعد از آن مقداری که متغیر رشته ای strName در آن لحظه دارد با دستور get گرفته می شود و با عملگر + به Hello اضافه می شود و کل این مقدار رشته ای (string) در text مربوط به لیبل lblWelcome قرار می گیرد و نمایش داده می شود.

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

همان طور که می بینید فعلا عبارت Hello World! نمایش داده شده، حالا داخل کادر یک اسم وارد می کنیم و دکمه را کلیک می کنیم. خواهیم دید که متن لیبل به صورت زیر تغییر خواهد کرد:

نکته ای که ممکن است به آن توجه کرده باشید این است که وقتی این برنامه را اجرا می کنید حتما باید داخل کادر Entry کلیک کنید تا بتوانید در آن تایپ نمایید. به اصطلاح در لحظه شروع برنامه فوکوس روی این ویجت نیست و برای اینکه در لحظه شروع بتوان بدون کلیک کردن در این ویجت در آن تایپ نماییم باید از focus استفاده کنیم. برای این کار یک خط بعد از تعریف txtName اضافه می کنیم و برنامه به شکل زیر تغییر می کند:

import tkinter as tk
from  tkinter import *
root=tk.Tk()
root.geometry("300x220")
root.resizable(False,False)
def clicked():
    lblWelcome.configure(text="Hello " + strName.get())
lblName=Label(root, text="What is your name?")
lblName.place(height=20,width=150,x=0,y=40)
lblWelcome=Label(root, text="Hello World")
lblWelcome.place(height=50,width=100,x=100,y=140)
btn=Button(root, text="Click Me!", command=clicked)
btn.place(height=40,width=100,x=100,y=100)
strName=tk.StringVar()
txtName=tk.Entry(root,textvariable=strName)
txtName.place(height=20,width=80,x=150,y=40)
txtName.focus()
root.mainloop()

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

حالا اگر بخواهیم محتویات یک ویجت Entry را مثلا متن داخل txtName را پاک کنیم کافی است از delete استفاده کنیم:

txtName.delete(0,"end")

در دستور بالا رشته ای را که از کاراکتر 0 ام شروع می شود تا کاراکتر آخر را پاک کرده ایم. می توان به جای این دو پارامتر اعداد دیگر هم قرار داد.

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

txtName.insert(0,"karakit")

مثلا در دستور بالا عبارت karakit را به کاراکتر 0 ام اضافه کردیم.

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