8.2.5 对话框*

除了利用窗口中的各种构件之外,应用程序与用户进行交互的另一个重要手段是对话框。 对话框是一个独立的顶层窗口,通常是在程序执行过程中根据需要而“弹出”的窗口,用于 从用户获取输入或者向用户显示消息。

对话框分为两种类型:模态(modal)和非模态(modeless)对话框①。模态对话框在关 闭之前将阻止程序其他窗口的操作,而非模态对话框则不会阻止程序其他窗口的操作。模态 对话框常用于向用户警告重要信息,或者等待用户输入必需的数据(如登录用户名和密码、 打开或保存文件输入文件名等)。

Tkinter 提供若干标准模块用于创建弹出式对话框:

  • tkMessageBox 模块:提供一系列用于显示信息或进行简单对话的消息框,可通过调 用函数 askokcancel、askquestion、askretrycancel、askyesno、showerror、showinfo 和 showwarning 来创建。

  • tkFileDialog 模块:提供用于文件浏览、打开和保存的对话框,可通过调用函数 askopenfilename 和 asksaveasfilename 来创建。

  • tkColorChooser 模块:提供用于选择颜色的对话框,可通过函数 askcolor 来创建。

① 这里“模态”的意思是:对话框影响着程序的某种执行模式(mode)、状态,因此必须完成对话才能继续。 非模态对话框则不表示特定程序模式,主程序可以不管对话结果而继续执行。

以上各种标准对话框模块的更多细节请参考本章附录或其他参考资料,在此我们只用几 个简单例子演示一下其用法。下面这个语句序列弹出一个简单的对话框(图 8.22①),然后根 据用户的回答进行适当处理。

>>> from Tkinter import *
>>> from tkMessageBox import *
>>> root = Tk()
>>> answer = askokcancel("Dialog","Is that OK?")
>>> if answer:
... print "OK"

图 8.22 askokcancel 对话框

下面这个语句尝试打开一个文件,如果打开失败则弹出一个报错消息框(图 8.23),并且 还会发出报警声响:

>>> try:
...     f = open(filename)
... except:
...     showwarning("Open file","Open failed")

图 8.23 showwarning 消息框

标准对话框模块对于应用程序的对话框设计通常已经够用,但有些应用程序可能需要更 复杂的对话框,这时我们可以定制对话框。设计自定义的对话框窗口与创建其他窗口并无本 质上的不同,主要步骤都是先创建 Toplevel 构件,然后添加所需的输入区、按钮和其他构件。 下面是一个定制消息框的简单程序:

① 从图中可见按钮文本是中文,这是因为 GUI 工具包都建立在底层操作系统的窗口管理器之上,本书作者 的计算机使用中文 Windows,其底层窗口管理器为常见按钮自动提供了中文文本。如果是英文版操作系统, 应该显示如函数名所提示的“OK”、“Cancel”、“Yes”、“No”等。

【程序 8.5】eg8_5.py

from Tkinter import *
def myMessageBox():
    top = Toplevel(height=200,width=400) 
Label(top,text='hello').pack()
root = Tk()
Button(root,text='click me',command = myMessageBox).pack() 
root.mainloop()

运行此程序 ,可看到根 窗口中有一 个“ click me ”按钮, 点击该按钮 将调用函数 myMessageBox,此函数首先创建一个顶层窗口,然后在其中添加一个标签,这相当于定制了 一个简陋的消息框。