用Toplevel类实现自定义模式和非模式对话框

在GUI程序设计中,经常要用到对话框。对话框分为模式对话框和非模式对话框。从主窗口打开模式对话框后,不关闭对话框,就不能操作主窗口。例如,常用的登录和注册对话框就是模式对话框。从主窗口打开非模式对话框后,不关闭对话框,也能操作主窗口。例如,文本编辑器中的查找和替换对话框就是非模式对话框,查找一般从光标处开始,如完成查找后,希望从开始再查找一次,必须在主窗口将光标移到开始处。
python tkinter中定义了多个模式对话框类,包括messagebox类(通用消息对话框类)、filedialog类(文件对话框类)、colorchooser类(颜色选择对话框类)、simpledialog类(简单对话框类)和dialog类(对话框类)。但这些类只能满足比较简单的应用,象登录和注册对话框这样的对话框,它需要输入用户名和密码,并要对输入的数据格式做检查,例如,注册时密码要求多少位,是否要求包括数字和字符,用户名是否唯一等。登录时要确定密码是否正确,不正确要求重新输入。对这些比较复杂的对话框,要使用Toplevel类生成自定义对话框。Toplevel类可以在主窗体外创建一个独立的窗口,它和用Tk()方创建出来的主窗口一样有标题栏、边框等部件,它们有相似的方法和属性。在Toplevel窗口中,能像主窗口一样放入Button、Labe和Entry等组件。Toplevel窗口和主窗口可以互相使用对方的变量和方法。一般用于创建自定义模式和非模式对话框。用Toplevel类创建的对话框默认是非模式对话框。
网上关于用Toplevel类生成模式对话框的文章很多,提出的方法五花八门,一般比较复杂。我总是觉得象python这样追求简单的语言,应该只修改一个属性或调用一个函数就能设置为模式对话框。经过长时间的摸索,发现Toplevel类方法grab_set()可完成此功能,变为模式对话框后,对话框蒋总在主窗口前边。下边是一个简单例子。

import tkinter as tk
def openDialog():
    global f1,e1            #在Toplevel窗口和主窗口可以互相使用对方的变量和方法。
    f1 = tk.Toplevel(root)  #用Toplevel类创建独立主窗口的新窗口
    f1.grab_set()           #将f1设置为模式对话框,f1不关闭无法操作主窗口
    #f1.transient(root)     #该函数使f1总是在父窗口前边,如父窗口最小化,f1被隐藏。模式对话框不用使用这条语句
    e1=tk.Entry(f1)         #可在e1中输入数据,单击确定按钮将数据显示在主窗口label1
    e1.pack()    
    b1 = tk.Button(f1,text='确定',command=showInput)
    b1.pack()    
def showInput():            #在此函数中,可检查数据格式是否正确
    label1['text']=e1.get() #显示e1中输入的数据
    f1.destroy()            #关闭对话框
root = tk.Tk()
root.geometry('200x200+50+50')
tk.Button(root, text="打开模式对话框", command=openDialog).pack()
label1=tk.Label(root,text='初始字符')
label1.pack()
root.mainloop()

非模式对话框可以在主窗口前边,也可能在后边,决定于谁获得焦点(例如被鼠标点击可获得焦点)。在使用非模式对话框时,有时希望非模式对话框总在主窗口的前边,例如文本编辑器的查找和替换对话框,可用如下语句。注意,模式对话框不用使用这条语句,模式对话框总在主窗口前边。
f1.transient(root) #该函数使f1总是在父窗口前边,如父窗口最小化,f1被隐藏

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值