کادر پیغام یا message box

در این قسمت قصد داریم نحوه اعلام و نمایش پیغام در tKinter را آموزش دهیم. در tKinter سه نوع پیغام قابل نمایش است. نوع اول صرفا اطلاعاتی را به کاربر نمایش می دهد.

نوع دوم هشدار یا خطایی را به کاربر نشان می دهد.

نوع سوم ضمن نمایش پیغام، می تواند با استفاده از چند دکمه از کاربر پاسخ دریافت کند.

مجموعا 8 تابع مختلف برای نمایش انواع پیغامها در tKinter وجود دارد که قالب کلی دستورات آنها مشابه هم است و دو مورد قابل تنظیم در این دستورات عنوان پیغام و متن پیغام است.  در ادامه با مثالهای ساده آنها را توضیح خواهیم داد.

نمایش اطلاعات با showinfo

به برنامه زیر توجه کنید:

import tkinter as tk
from tkinter import *
from tkinter import messagebox
root=tk.Tk()
root.geometry("300x200")
root.resizable(False,False)
def showinformation():
    tk.messagebox.showinfo(title='karakit info', message='information message is shown')
btn=Button(root, text="show information", command=showinformation)
btn.place(height=50,width=150,x=75,y=70)
root.mainloop()

توضیح برنامه

یک تفاوت که این برنامه با برنامه های قبلی دارد در این است که در خط 3 messagebox را فراخوانی کرده ایم. در خط 9 یک دکمه به نام btn در صفحه قرار داده ایم که با فشرده شدن آن تابع showinformation فراخوانی و اجرا می شود. این تابع را در خط 7 و 8 تعریف کرده ایم. در این تابع با استفاده از دستور messagebox.showinfo  یک پیغام نمایش داده می شود. عنوانی که در بالای کادر پیغام نمایش داده می شود karakit info و متن پیغام information message is show  است.

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

showinfo

با فشردن دکمه کادر پیغام به این شکل نمایش داده می شود:

نمایش هشدار با showwarning

در واقع این نوع پیغام تفاوت عمده ای با نوع قبلی که نمایش اطلاعات بود ندارد. برنامه مربوط به این پیغام را می توانید در زیر مشاهده کنید:

import tkinter as tk
from tkinter import *
from tkinter import messagebox
root=tk.Tk()
root.geometry("300x200")
root.resizable(False,False)
def showwarning():
    tk.messagebox.showwarning(title='karakit warning', message='warning message is shown')
btn=Button(root, text="show warning", command=showwarning)
btn.place(height=50,width=150,x=75,y=70)
root.mainloop()

توضیح برنامه

مثل برنامه قبل در خط 9 یک دکمه به نام btn در صفحه قرار داده ایم. با فشرده شدن آن تابع showwarning فراخوانی و اجرا می شود. این تابع را 7 و 8 تعریف کرده ایم. در این تابع با استفاده از دستور messagebox.showwarning یک پیغام نمایش داده می شود. عنوانی که در بالای کادر پیغام نمایش داده می شود karakit warning  و متن پیغام warning message is shown  است.

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

showwarning

با فشردن دکمه کادر پیغام هشدار به این شکل نمایش داده می شود:

همان طور که می بینید غیر از علامت گرافیکی که در این کادر با کادر قبلی فرق دارد، تفاوت دیگری دیده نمی شود و کاربر هم نمی تواند غیر از دکمه ok دکمه دیگری را کلیک کند.

نمایش خطا با showerror

این نوع پیغام نیز تفاوت عمده ای با انواع قبلی که نمایش اطلاعات و هشدار بود ندارد. برنامه مربوط به این پیغام را می توانید در زیر مشاهده کنید:

import tkinter as tk
from tkinter import *
from tkinter import messagebox
root=tk.Tk()
root.geometry("300x200")
root.resizable(False,False)
def showerror():
    tk.messagebox.showerror(title='karakit error', message='error message is shown')
btn=Button(root, text="show error", command=showerror)
btn.place(height=50,width=150,x=75,y=70)
root.mainloop()

توضیح برنامه

در خط 9 یک دکمه به نام btn در صفحه قرار داده ایم. با فشرده شدن آن تابع showerror  فراخوانی و اجرا می شود. این تابع را در خط 7 و 8 تعریف کرده ایم. در این تابع با استفاده از دستور messagebox.showerror   یک پیغام نمایش داده می شود. عنوانی که در بالای کادر پیغام نمایش داده می شود karakit error  و متن پیغام error message is shown  است.

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

showerror

با فشردن دکمه کادر پیغام خطا به این شکل نمایش داده می شود:

در پیغام خطا نیز غیر از علامت گرافیکی که در این کادر با کادرهای قبلی فرق دارد، تفاوت دیگری دیده نمی شود و کاربر هم نمی تواند غیر از دکمه ok دکمه دیگری را کلیک کند.

پرسش از کاربر با askquestion

تا حالا با پیغامهایی آشنا شدیم که فقط می شد درباره مساله ای به کاربر اطلاع رسانی کرد. اما 5 پیغام بعدی این قابلیت را دارند که سوالی را مطرح کنند و کاربر در پاسخ یکی از دکمه ها را کلیک کند و از این طریق یه برنامه پاسخ بدهد. اولین نوع این پیغامها با دستور messagebox.askquestion ایجاد می شوند که در ادامه با یک برنامه نحوه استفاده از آن را شرح می دهیم:

import tkinter as tk
from tkinter import *
from tkinter import messagebox
root=tk.Tk()
root.geometry("300x200")
root.resizable(False,False)
def ask():
    ans=tk.messagebox.askquestion(title='karakit question', message='Do you like python?')
    if ans == 'yes':
        lbl.configure(text="You like python")
    else:
        lbl.configure(text="You don't like python")
btn=Button(root, text="ask question", command=ask)
btn.place(height=50,width=150,x=75,y=50)
lbl=Label(root,text="Your answer will be shown here")
lbl.place(height=50,width=150,x=75,y=120)
root.mainloop()

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

askquestion

با کلیک دکمه یک کادر ظاهر می شود که از شما می پرسد پایتون را دوست دارید یا نه؟ متن لیبل با توجه به جواب شما تغییر خواهد کرد:

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

در خط 13 یک دکمه به نام btn در صفحه قرار داده ایم. با فشرده شدن آن تابع ask فراخوانی و اجرا می شود. این تابع را در خطهای 7 تا 12 تعریف کرده ایم. در این تابع با استفاده از دستور messagebox. askquestion   یک سوال نمایش داده می شود و اگر کابر دکمه yes  را فشار بدهد مقداری که در متغیر ans ذخیره می شود ‘yes’ و اگر دکمه no را کلیک کند مقدار ‘no’ در این متغیر ذخیره خواهد شد. عنوانی که در بالای کادر پیغام نمایش داده می شود karakit question  و متن سوال Do you like python  است.

سپس با یک شرط ساده بررسی می کنیم که این مقدار yes هست یا no؟ و با توجه به این مقدار متن لیبل را تغییر می دهیم.

قبول یا لغو با askokcancel

در این نوع پیغام سوالی از کاربر پرسیده می شود و دو دکمه ok و cancel نشان داده می شود که کاربر می تواند یکی از آنها را کلیک کند. در چگونگی استفاده از آن با حالت askquestion تفاوت چندانی وجود ندارد.

در ادامه برای یادگیری این نوع پیغام برنامه ای می نویسیم که با فشردن دکمه از کاربر پرسیده می شود که آیا قصد خروج از برنامه را دارد یا نه؟ اگر جواب ok بود از برنامه خارج می شود و اگر جواب cancel بود مجددا به محیط برنامه بر می گردد.

import tkinter as tk
from tkinter import *
from tkinter import messagebox
root=tk.Tk()
root.geometry("300x200")
root.resizable(False,False)
def ask():
    ans=tk.messagebox.askokcancel(title='karakit ok cancel', message='Do you want to quit?')
    if ans :
        root.destroy()
    else:
        pass
btn=Button(root, text="Quit", command=ask)
btn.place(height=50,width=150,x=75,y=70)
root.mainloop()

دو تفاوت مهم این برنامه با برنامه قبل این است که از messagebox.askokcancel برای نمایش کادر پیغام استفاده می شود و این بار خروجی این پیغام که در متغیر  ans ذخیره می گردد متنی نیست، بلکه اگر کاربر دکمه ok را کلیک کنیک این مقدار True و اگر cancel را انتخاب کند این مقدار False خواهد بود.

در شکل زیر نتیجه اجرای برنامه را می بینید:

askokcancel

با کلیک روی دکمه Quit کادر پیغام زیر نمایش داده می شود که کاربر می تواند یکی از 2 دکمه را کلیک کند:

بله و خیر با askyesno

اگر در برنامه قبلی به جای استفاده از messagebox.askokcancel از دستور messagebox.askyesno استفاده کنیم، به جای دو گزینه ok و cancel ، دو گزینه yes  و  no در اختیار کاربر قرار داده می شود و هیچ تفاوت دیگری با برنامه قبل نخواهد داشت.

تفاوت کادر پیغام در عکس زیر قابل مشاهده است:

askyesno

تلاش دوباره یا انصراف با askretrycancel

دستور بعدی که برای ایجاد یک پیغام مبتنی بر تکرار یک عملیات یا انصراف از ادامه آن است messagebox.askretrycancel است. چگونگی عملکرد آن مشابه دو مورد قبلی است. اما نحوه نمایش کادر به این صورت است:

askretrycancel

بله و خیر و انصراف با askyesnocancel 

آخرین نوع پیغامی که می توان نمایش داد از طریق askyesnocancel  ایجاد می شود و تنها پیغامی است که به کاربر 3 دکمه برای انتخاب ارایه می دهد. نحوه استفاده از آن در برنامه زیر مشخص شده است:

import tkinter as tk
from tkinter import *
from tkinter import messagebox
root=tk.Tk()
root.geometry("300x200")
root.resizable(False,False)
def ask():
    ans=tk.messagebox.askyesnocancel(title='karakit yes no cancel', message='YES or No or CANCEL?')
    if ans:
        lbl.configure(text="You chose YES!")
    elif ans is None:
        lbl.configure(text="You chose CANCEL!")
    else:
        lbl.configure(text="You chose NO!")
btn=Button(root, text="ask question", command=ask)
btn.place(height=50,width=150,x=75,y=50)
lbl=Label(root,text="Your answer will be shown here",relief="groove")
lbl.place(height=50,width=200,x=50,y=120,)
root.mainloop()

با اجرای برنامه پنجره زیر نمایش داده می شود و با کلیک روی دکمه یک کادر پیغام با 3 دکمه طبق شکل ظاهر می شود:

askyesnocancel

نتیجه کلیک روی دکمه yes مقدار منطقی True ، نتیجه کلیک روی دکمه No مقدار منطقی False و نتیجه کلیک روی Cancel مقدار None است. بنابراین با کلیک روی هر یک از این 3 دکمه پیغام متناظر با آن نمایش داده می شود.