对话框是什么意思

介绍Tkinter下的对话框使用,包括对话框、输入对话框、文件对话框、颜色选择对话框、自定义对话框以及什么是模式对话框和非模式对话框等!

对话框是什么意思

Tk-对话框

对话框

对话框是GUI编程中常用的组件 对话框看上去是顶级窗口,其实对话框依赖其他窗口,也就是主窗口

对话框可分别通过simpledialog.SimpleDialog和dialog.Dialog创建:

使用 simpledialog.SimpleDialog 创建对话框title:指定该对话框的标题text:指定对话框的内容button:指定对话框下方的几个按钮default:指定对话框中默认第几个按钮得到焦点cancel:指定当对话框右上角的X按钮关闭对话框时,该对话框的返回值使用 dialog.Dialog 创建对话框,通过 dict 来指定参数值:title:指定对话框的标题text:指定对话框的内容strings:指定对话框下方的几个按钮default:指定对话框中默认第几个按钮得到焦点bitmap:指定对话框上的图标

使用simpledialog.SimpleDialog 和 dialog.Dialog 创建对话框差别不大:dialog.Dialog 需要使用 dict 设置参数还有一点:dialog.Dialog对话框样式比simpledialog.SimpleDialog好看不少

使用示例

from tkinter import *
# 导入ttk
from tkinter import ttk
# 导入simpledialog
from tkinter import simpledialog
# 导入dialog
from tkinter import dialog
class App(object):
def __init__(self, mw):
self.mw = mw
self.initWidgets()
def initWidgets(self):
self.msg = ‘雷那网,一个有温度的Python兴趣屋!’
# 创建2个按钮,并为之绑定事件处理函数
ttk.Button(self.mw, text=’打开SimpleDialog对话框’,
command=self.open_simpledialog
).pack(side=LEFT, ipadx=5, ipady=5, padx= 10)
ttk.Button(self.mw, text=’打开Dialog对话框’,
command=self.open_dialog
).pack(side=LEFT, ipadx=5, ipady=5, padx = 10)

def open_simpledialog(self):
d = simpledialog.SimpleDialog(self.mw,
title=’SimpleDialog对话框’,
text=self.msg, # 内容
buttons=[“是”, “否”, “取消”],
cancel=3,
default=0
)
# 对话框返回值
print(d.go())

def open_dialog(self):
d = dialog.Dialog(self.mw,
{‘title’: ‘Dialog对话框’,
‘text’:self.msg,
‘bitmap’: ‘question’, # 图标
‘default’: 0, # 设置默认选中项
# strings选项用于设置按钮
‘strings’: (‘确定’,
‘取消’,
‘退出’)})
# 对话框返回值
print(d.num)
if __name__ == ‘__main__’:
mw = Tk()
mw.title(“对话框”)
mw.iconbitmap(‘image/www.tpleina.com.ico’)
App(mw)
mw.mainloop()

以上示例使用位图,系统内置10个位图,可以直接使用:

errorgray75gray50gray25gray12howglassinfoquestheadquestionwarning

模式/非模式对话框

在进行后面内容之前,先说一下什么是模式对话框,什么是非模式对话框

模式对话框: 只有在关闭模式对话框后,才能操作其父窗口非模式对话框:非模式对话框可以不关闭,也能操作其父窗口

使用SimpleDialog和Dialog创建的对话框都是模式对话框

输入对话框

在simpledialog模块提供以下几个工具函数,该工具函数能够生成输入对话框:

askinteger:输入整数的对话框askfloat:输入浮点数的对话框askstring:输入字符串的对话框

工具函数前两个参数分别指定对话框的标题和提示信息,后面通过选项设置对话框的初始值、最大值和最小值

示例代码:

# -*- coding:utf-8 -*-
from tkinter import *
# 导入ttk
from tkinter import ttk
# 导入simpledialog
from tkinter import simpledialog
class App(object):
def __init__(self, mw):
self.mw = mw
self.initWidgets()

def initWidgets(self):
# 创建3个按钮,绑定事件处理函数
ttk.Button(self.mw, text=’输入整数对话框’,
command=self.open_integer
).pack(side=LEFT, ipadx=5, ipady=5, padx= 10)
ttk.Button(self.mw, text=’输入浮点数对话框’,
command=self.open_float
).pack(side=LEFT, ipadx=5, ipady=5, padx= 10)
ttk.Button(self.mw, text=’输入字符串对话框’,
command=self.open_string
).pack(side=LEFT, ipadx=5, ipady=5, padx= 10)

def open_integer(self):
# 输入整数的对话框
print(simpledialog.askinteger(“年龄”, “请输入你的年龄:”,
initialvalue=1, minvalue=1, maxvalue=150))

def open_float(self):
# 输入浮点数的对话框
print(simpledialog.askfloat(“身高”, “请输入你的身高:”,
initialvalue=0.1, minvalue=0.5, maxvalue=2.5))

def open_string(self):
# 输入字符串的对话框
print(simpledialog.askstring(“名字”, “请输入你的姓名:”,
initialvalue=’张某某’))
if __name__ == “__main__”:
root = Tk()
root.title(“输入对话框”)
root.iconbitmap(‘image/www.tpleina.com.ico’)
App(root)
root.mainloop()

文件对话框

filedialog模块下提供创建文件对话框工具函数,如下:

askopenfile():生成打开单个文件的对话框,返回所选择文件的文件流askopenfiles():生成打开多个文件的对话框,返回多个所选择文件的文件流组成的列表askopenfilename():生成打开单个文件的对话框,返回所选择文件的文件路径askopenfilenames():生成打开多个文件的对话框,返回多个所选择文件的文件路径组成的元组asksaveasfile():生成保存文件的对话框,返回所选择文件的文件输出流asksaveasfilename():生成保存文件的对话框,返回所选择文件的文件路径askdirectory():生成打开目录的对话框

这些工具函数支持选项:

defaultextension:指定默认扩展名filetypes:指定文件对话框能查看的文件类型,“*”指定浏览所有文件initialdir:指定初始打开的目录initialfile:指定所选择的文件parent:指定该对话框的属主窗口title:指定对话框的标题multiple:指定是否允许多选mustexist: 指定是否只允许打开己存在的目录,仅支持askdirectory()

# -*- coding:utf-8 -*-
from tkinter import *
# 导入ttk
from tkinter import ttk
# 导入filedialog
from tkinter import filedialog
class App(object):
def __init__(self, mw):
self.mw = mw
self.initWidgets()
def initWidgets(self):
# 创建7个按钮,绑定事件处理函数
ttk.Button(self.mw, text=’打开单个文件’,
command=self.open_file
).pack(side=LEFT, ipadx=5, ipady=5, padx= 10)
ttk.Button(self.mw, text=’打开多个文件’,
command=self.open_files
).pack(side=LEFT, ipadx=5, ipady=5, padx= 10)
ttk.Button(self.mw, text=’获取单个打开文件的文件名’,
command=self.open_filename
).pack(side=LEFT, ipadx=5, ipady=5, padx= 10)
ttk.Button(self.mw, text=’获取多个打开文件的文件名’,
command=self.open_filenames
).pack(side=LEFT, ipadx=5, ipady=5, padx= 10)
ttk.Button(self.mw, text=’获取保存文件’,
command=self.save_file
).pack(side=LEFT, ipadx=5, ipady=5, padx= 10)
ttk.Button(self.mw, text=’获取保存文件的文件名’,
command=self.save_filename
).pack(side=LEFT, ipadx=5, ipady=5, padx= 10)
ttk.Button(self.mw, text=’打开路径’,
command=self.open_dir
).pack(side=LEFT, ipadx=5, ipady=5, padx= 10)

def open_file(self):
# 创建单个打开的文件对话框
print(filedialog.askopenfile(title=’打开单个文件’,
filetypes=[(“文本文件”, “*.txt”), (‘Python源文件’, ‘*.py’)],
initialdir=’e:/’))

def open_files(self):
# 创建多个打开的文件对话框
print(filedialog.askopenfiles(title=’打开多个文件’,
filetypes=[(“文本文件”, “*.txt”), (‘Python源文件’, ‘*.py’)],
initialdir=’e:/’))
def open_filename(self):
# 创建个文件的文件名对话框
print(filedialog.askopenfilename(title=’打开单个文件’,
filetypes=[(“文本文件”, “*.txt”), (‘Python源文件’, ‘*.py’)],
initialdir=’e:/’))
def open_filenames(self):
# 创建多个文件的文件名对话框
print(filedialog.askopenfilenames(title=’打开多个文件’,
filetypes=[(“文本文件”, “*.txt”), (‘Python源文件’, ‘*.py’)],
initialdir=’e:/’))
def save_file(self):
# 创建保存文件对话框
print(filedialog.asksaveasfile(title=’保存文件’,
filetypes=[(“文本文件”, “*.txt”), (‘Python源文件’, ‘*.py’)],
initialdir=’e:/’))
def save_filename(self):
# 创建保存文件的文件名对话框
print(filedialog.asksaveasfilename(title=’保存文件’,
filetypes=[(“文本文件”, “*.txt”), (‘Python源文件’, ‘*.py’)],
initialdir=’e:/’))
def open_dir(self):
# 创建打开目录对话框
print(filedialog.askdirectory(title=’打开目录’,
initialdir=’e:/’))
if __name__ == “__main__”:
mw = Tk()
mw.title(“文件对话框使用”)
mw.iconbitmap(‘image/www.tpleina.com.ico’)
App(mw)
mw.mainloop()

颜色选择对话框

colorchooser模块提供了用于创建颜色选择对话框的askcolor()工具函数,该工具函数支持参数:

parent:指定对话框的属主窗口title:指定对话框的标题color:指定对话框初始选择的颜色

# -*- coding:utf-8 -*-
from tkinter import *
# 导入ttk
from tkinter import ttk
# 导入colorchooser
from tkinter import colorchooser
class App(object):
def __init__(self, mw):
self.mw = mw
self.initWidgets()
def initWidgets(self):
# 创建1个按钮,绑定事件处理函数
ttk.Button(self.mw, text=’选择颜色’,
command=self.choose_color
).pack(side=LEFT, ipadx=5, ipady=5, padx= 10)

def choose_color(self):
# 创建颜色选择对话框
print(colorchooser.askcolor(parent=self.mw, title=’选择颜色’,
color = ‘blue’))
if __name__ == “__main__”:
mw = Tk()
mw.title(“颜色对话框使用”)
mw.iconbitmap(‘image/www.tpleina.com.ico’)
App(mw)
mw.mainloop()

运行效果:

对话框是什么意思

Tk颜色对话框

自定义对话框

使用SimpleDialog 还是 Dialog创建对话框,其对话框布局样式比较固定,不能自定义其他内容,添加其他组件,这就需要自定义对话框

实现自定义对话框,依赖于Toplevel定层窗口组件,调用Toplevel的grab_set() 让对话框变成模式对话框,否则就是非模式对话框

自定义对话框示例:

# -*- coding:utf-8 -*-
from tkinter import *
# 导入ttk
from tkinter import ttk
from tkinter import messagebox
class CusDialog(Toplevel):
“””实现自定义对话框类,继承Toplevel”””
def __init__(self, parent, title = None, modal=True):
Toplevel.__init__(self, parent)
self.transient(parent)
# 设置标题
if title: self.title(title)
self.iconbitmap(‘image/www.tpleina.com.ico’)
self.parent = parent
self.modal = modal
self.initWidgets()

def initWidgets(self):
# 创建对话框主体内容
frame = Frame(self)
# 创建并添加Label
Label(frame, text=’用户名’, font=12, width=10).grid(row=1, column=0)
self.name_entry = Entry(frame, font=16)
self.name_entry.grid(row=1, column=1)
# 创建并添加Label
Label(frame, text=’密 码’, font=12,width=10).grid(row=2, column=0)
self.pass_entry = Entry(frame, font=16)
self.pass_entry.grid(row=2, column=1)
frame.pack(padx=5, pady=5)

# 创建按钮
f = Frame(self)
# 创建”确定”按钮,位置绑定self.ok_click处理方法
w = Button(f, text=”确定”, width=10, command=self.ok_click, default=ACTIVE)
w.pack(side=LEFT, padx=5, pady=5)
# 创建”确定”按钮,位置绑定self.cancel_click处理方法
w = Button(f, text=”取消”, width=10, command=self.cancel_click)
w.pack(side=LEFT, padx=5, pady=5)
self.bind(“<Return>”, self.ok_click)
self.bind(“<Escape>”, self.cancel_click)
f.pack()
# 是否为模式对话框
if self.modal: self.grab_set()
# 当窗口被关闭的时候,调用self.cancel_click方法
self.protocol(“WM_DELETE_WINDOW”, self.cancel_click)
# 根据父窗口来设置对话框的位置
self.geometry(“+%d+%d” % (self.winfo_rootx() + 150, self.winfo_rooty() + 200))
self.wait_window(self)

def validate(self):
“””校验用户输入数据有效性”””
pass
return True

# 该方法可处理用户输入的数据
def process_input(self):
user_name = self.name_entry.get()
user_pass = self.pass_entry.get()
messagebox.showinfo(message=’用户输入的用户名: %s, 密码: %s’
% (user_name , user_pass))
def ok_click(self, event=None):
print(‘确定’)
# 校验用户输入
if not self.validate():
return
self.withdraw()
self.update_idletasks()
# 获取用户输入数据
self.process_input()
# 将焦点返回给父窗口
self.parent.focus_set()
# 销毁自己
self.destroy()
def cancel_click(self, event=None):
print(‘取消’)
# 将焦点返回给父窗口
self.parent.focus_set()
# 销毁自己
self.destroy()
class App(object):
def __init__(self, mw):
self.mw = mw
self.initWidgets()
def initWidgets(self):
# 创建2个按钮,并为之绑定事件处理函数
ttk.Button(self.mw, text=’模式对话框’,
command=self.open_modal # 绑定open_modal方法
).pack(side=LEFT, ipadx=5, ipady=5, padx= 10)
ttk.Button(self.mw, text=’非模式对话框’,
command=self.open_none_modal # 绑定open_none_modal方法
).pack(side=LEFT, ipadx=5, ipady=5, padx= 10)

def open_modal(self):
CusDialog(self.mw, title=’模式对话框’) # 默认是模式对话框

def open_none_modal(self):
CusDialog(self.mw, title=’非模式对话框’, modal=False)
if __name__ == “__main__”:
mw = Tk()
mw.title(“自定义对话框”)
mw.iconbitmap(‘image/www.tpleina.com.ico’)
App(mw)
mw.mainloop()

运行效果:

对话框是什么意思

Tk自定义对话框

本文来自小情话投稿,不代表胡巴网立场,如若转载,请注明出处:https://www.hu85.com/321412.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 xxxxx@qq.com 举报,一经查实,本站将立刻删除。