详解tkinter.messagebox

发布时间:2023-05-18

一、使用tkinter.messagebox简易实现提示框

在开发GUI应用程序时,提示框既是不可或缺的消息通知方式,也是用户交互界面中一种常见的交互方式。Python内置的模块tkinter提供了一个方便的消息框工具类——tkinter.messagebox。可以用它很容易地实现消息提示框、选择提示框等,本节主要介绍如何使用tkinter.messagebox实现简单的消息提示框。 比如,下面的代码实现了一个简单的提示框,当用户单击“提示”按钮时,程序会显示一个消息框,其中包含一个标题、一条消息和一个“OK”按钮。

import tkinter as tk
from tkinter import messagebox
def show_info():
    messagebox.showinfo("提示框", "Hello, World!")
root = tk.Tk()
root.geometry("200x50")
btn_info = tk.Button(root, text="提示", command=show_info)
btn_info.pack(pady=10)
root.mainloop()

当用户单击“提示”按钮时,将显示如下图所示的提示框: 通过showinfo方法可以创建一个消息框,其中第一个参数为标题,第二个参数为消息内容。Messagebox常用的几个方法如下:

  • showinfo(title=None, message=None, **options):显示一个消息框。
  • showwarning(title=None, message=None, **options):显示一个警告框。
  • showerror(title=None, message=None, **options):显示一个错误框。
  • askquestion(title=None, message=None, **options):显示一个是/否的询问框。
  • askokcancel(title=None, message=None, **options):显示一个确认/取消的询问框。
  • askyesno(title=None, message=None, **options):显示一个是/否的询问框。 options参数可以用来设置一些高级选项,如图标、默认按钮等。

二、封装自定义的tkinter.messagebox

从上面的例子可以看出,使用tkinter.messagebox可以很方便地创建不同类型的消息框。但是,如果需要修改消息框的视觉效果或增加新的布局样式,可能就不太容易实现。在实际开发中,我们通常会自定义一些常用的消息框,以供整个应用程序重复调用,提高了应用程序的开发效率。我们可以参考tkinter.messagebox的实现方式,自定义一些方法,比如说,我们可以自己实现一个简单的输入框并加以封装。 下面的代码实现了一个自定义的消息框,类似于input函数,用于让用户输入字符串,并返回输入的值。我们在tkinter.messagebox的基础上,增加了一个Entry组件,用户可以在其中输入字符串,然后返回输入的值。实现的过程中,需要借助Toplevel、Label、Entry、Button等组件。

class InputBox:
    def __init__(self, title="", prompt="", default=""):
        self.value = None
        self.top = tk.Toplevel()
        self.top.resizable(0, 0)
        self.top.title(title)
        tk.Label(self.top, text=prompt).pack(pady=10)
        self.var = tk.StringVar()
        self.var.set(default)
        tk.Entry(self.top, textvariable=self.var).pack(padx=20, pady=10)
        btn_ok = tk.Button(self.top, text="确定", command=self.ok)
        btn_ok.pack(pady=10)
        btn_cancel = tk.Button(self.top, text="取消", command=self.top.destroy)
        btn_cancel.pack(pady=5)
        self.top.bind('<Return>', self.ok) 
        self.top.bind('<Escape>', lambda _: self.top.destroy()) 
        self.top.wait_visibility()
        self.top.grab_set()
        self.top.mainloop()
    def ok(self, *_):
        self.value = self.var.get()
        self.top.destroy()

InputBox类实现了一个简单的对话框,其中构造函数__init__包含三个参数:title表示消息框的标题,prompt表示消息框中的提示语,default表示默认显示的字符串。 在创建InputBox类的实例时,类的构造函数会创建一个新的Toplevel窗口,并设置其为不可改变大小。接着,使用Label显示提示语,使用Entry组件获取用户输入,并创建“确认”和“取消”按钮。如果用户在提示框内按下Enter键,则自动调用ok方法。如果用户按Esc键,则关闭消息框,并返回None。 使用该自定义的InputBox消息框,下面的代码实现了一个简单的输入框,当用户单击“输入”按钮时,程序弹出一个消息框,要求输入一个字符串,并且将用户输入的字符串在控制台上输出。

def show_input():
    input_box = InputBox("输入框", "请输入内容:")
    print("用户输入了:", input_box.value)
root = tk.Tk()
root.geometry("200x50")
btn_input = tk.Button(root, text="输入", command=show_input)
btn_input.pack(pady=10)
root.mainloop()

三、使用tkinter.messagebox实现多种提示框效果

除了常见的消息提示框、选择提示框等标准功能之外,tkinter.messagebox还可以实现很多其他类型的消息框,如问题提示框、警告提示框等。下面分别介绍如何实现这些消息框。

1. 问题提示框

问题提示框常用于需要用户做出决策的场景,如确认是否删除某个文件,是否继续操作等。askquestion方法实现了一个问答框,其中显示用户提出的问题和两个按钮:“是”和“否”。

def show_question():
    result = messagebox.askquestion("提示框", "您确定要退出吗?")
    print(result)
root = tk.Tk()
root.geometry("200x50")
btn_question = tk.Button(root, text="问题", command=show_question)
btn_question.pack(pady=10)
root.mainloop()

当用户单击“问题”按钮时,程序将显示一个带有“是”和“否”两个选项的消息框,如下图所示: 如果用户单击“Yes”按钮,返回“yes”,否则返回“no”。

2. 警告提示框

警告提示框用于向用户提供警告信息,通常是因为相关活动可能对系统或应用程序造成不良影响而发出警告。showwarning方法实现了一个带有“警告”图标的提示框。

def show_warning():
    messagebox.showwarning("提示框", "注意!系统将要关机!")
root = tk.Tk()
root.geometry("200x50")
btn_warning = tk.Button(root, text="警告", command=show_warning)
btn_warning.pack(pady=10)
root.mainloop()

当用户单击“警告”按钮时,程序将显示一个带有“!”图标的消息框,如下图所示: 点击OK按钮会关闭提示框。

3. 错误提示框

错误提示框用于向用户提供错误信息,通常表示操作无法完成或者出现了错误。showerror方法实现了一个带有“错误”图标的提示框。

def show_error():
    messagebox.showerror("提示框", "抱歉,操作失败!")
root = tk.Tk()
root.geometry("200x50")
btn_error = tk.Button(root, text="错误", command=show_error)
btn_error.pack(pady=10)
root.mainloop()

当用户单击“错误”按钮时,程序将显示一个带有“X”图标的消息框,如下图所示: 点击OK按钮会关闭提示框。

4. 确认/取消提示框

确认/取消提示框通常用于需要确认或取消操作的场景,如确认打印文档、是否保存更改等。askokcancel方法实现了一个带有“确认”和“取消”两个按钮的对话框。

def show_confirm():
    result = messagebox.askokcancel("提示框", "确定要退出吗?")
    print(result)
root = tk.Tk()
root.geometry("200x50")
btn_confirm = tk.Button(root, text="确认/取消", command=show_confirm)
btn_confirm.pack(pady=10)
root.mainloop()

当用户单击“确认/取消”按钮时,程序将显示一个带有“确认”和“取消”两个选项的消息框,如下图所示: 如果点击确认,则返回True,否则返回False。

5. 是/否提示框

是/否提示框与确认/取消提示框类似,不同的是,askyesno方法实现了一个带有“是”和“否”两个按钮的问答框。

def show_yesno():
    result = messagebox.askyesno("提示框", "您确定要退出吗?")
    print(result)
root = tk.Tk()
root.geometry("200x50")
btn_yesno = tk.Button(root, text="是/否", command=show_yesno)
btn_yesno.pack(pady=10)
root.mainloop()

当用户单击“是/否”按钮时,程序将显示一个带有“是”和“否”两个选项的消息框,如下图所示: 如果点击是,则返回True,否则返回False。

总结

本文介绍了tkinter.messagebox的基本用法,并且通过自定义消息框的例子说明了如何在实际应用中封装常用的消息框。同时,展示了使用tkinter.messagebox实现不同类型提示框的方法,包括问题提示框、警告提示框、错误提示框、确认/取消提示框、是/否提示框等。