菜单与对话框
(一)菜单

创建菜单的主要步骤如下:
(1)创建菜单条对象
menubar = Menu(窗体容器)
(2)把菜单条放置到窗体中
窗体容器. config(menu = menubar)
(3)在菜单条中创建菜单
菜单名称 = Menu(menubar, tearoff = 0)
其中,tearoff取值0表示菜单不能独立使用。
(4)为菜单添加文字标签
menubar.add_cascade(label = "文字标签", menu = 菜单名称)
(5)在菜单中添加菜单项
菜单名称.add_command(label = "菜单项名称", command = 功能函数名)
''' 菜单控件Menu '''
例:建名为me的菜单对象
import tkinter as tk
top=tk.Tk()
top.title('python GUI')
top.geometry('300x100+125+100') #设置窗口位置和尺寸
me=tk.Menu(top) #创建名为me的菜单对象 #以按钮形式循环添加5个菜单项
for i in ['File','View','Edit','Tools','Help']:
me.add_cascade (label=i) #将top的menu属性设置为me
top['menu']=me
top.mainloop()

例:菜单控件Menu
''' 菜单控件Menu '''
import tkinter as tk
top=tk.Tk()
top.title('python GUI')
top.geometry('260x80')
lab=tk.Label(top,text='',bd=2,fg='Red',relief='sunken',
width=23,height=1,font=('隶书',14))
lab.pack(side='bottom',pady=15)
#定义4个回调函数
def doj_1():
lab.config(text='做“文件”要做的事!')
def doj_2():
lab.config(text='做“编辑”要做的事!')
def doj_3():
lab.config(text='做“子菜单1”要做的事!')
def doj_4():
lab.config(text='做“子菜单2”要做的事!')
menb=tk.Menu(top) #在顶层窗口top创建主菜单对象menb
menb.add_command(label='文件',command=doj_1) #“文件”主菜单项没有子菜单
menb.add_command(label='编辑',command=doj_2) #“编辑”主菜单项没有子菜单
mens=tk.Menu(menb) #创建菜单对象menb的级联子菜单对象mens
menb.add_cascade(label='存放',menu=mens)
#将子菜单mens绑定到“存放”主菜单项
mens.add_command(label='子菜单1',command=doj_3) #将子菜单1添加到mens
mens.add_command(label='子菜单2',command=doj_4) #将子菜单2添加到mens
top['menu']=menb #将整个菜单控件menb赋予顶层窗口
top.mainloop()


(二)对话框
Tkinter提供了三种标准的对话框模块:
消息对话框messagebox
文件对话框filedialog
颜色选择对话框colorchooser
1. 无返回值的消息对话框
消息对话框分为无返回值的对话框和有返回值的对话框,这二种消息对话框的导入模块语句都是一样的。
(1)消息对话框的导入模块语句
import tkinter
import tkinter.messagebox #这个是消息框,对话框的关键
(2)消息提示框
tkinter.messagebox.showinfo('提示','人生苦短')

(3)消息警告框
tkinter.messagebox.showwarning('警告','明日有大雨')

(4)错误消息框
tkinter.messagebox.showerror('错误','出错了')

例:无返回值消息对话框示例。
import tkinter
import tkinter.messagebox
def but_info():
tkinter.messagebox.showinfo('提示','人生苦短')
def but_warning():
tkinter.messagebox.showwarning('警告','明日有大雨')
def but_error():
tkinter.messagebox.showerror('错误','出错了')
root=tkinter.Tk() #标题
root.title("消息对话框")
root.geometry("400x400") #窗体大小
root.resizable(False,False) #固定窗体
tkinter.Button(root,text='消息提示框',command=but_info).pack()
tkinter.Button(root,text='消息警告框',command=but_warning).pack()
tkinter.Button(root,text='错误消息框',command=but_error).pack()
root.mainloop()
例:''' 编写一个小程序,在顶层窗口上放3个按钮,即“输入姓名”“输入分数”“退出”, 再安放一个多行文本框,以存放输入的姓名、分数及总计。
该程序用到简易对话框。 '''
import tkinter.simpledialog
import tkinter as tk
top=tk.Tk()
top.title('python GUI')
top.geometry('240x200+10+10')
txt1=tk.Text(top,bd=2,fg='Red',relief='sunken',
width=15,height=7,font=('隶书',14))
txt1.pack(side='bottom',pady=10)
def proword(): #处理输入字符串
name=tk.simpledialog.askstring(title='请输入姓名字符串', prompt='Your name:')
txt1.insert('end','姓名'+name+'\n')
def proint(): #处理输入整数
score=[] #是一个列表
count=0
total=0
while True:
number=tk.simpledialog.askinteger(title='请输入整数值',prompt='分数(5门):',maxvalue=100,minvalue=60)
score.append(number)
txt1.insert('end',str(score[count])+'\n')
count+=1
total+=number
if count==5:
break
txt1.insert('end','总计:'+str(total))
but1=tk.Button(text='输入姓名',width=8, bd=3,fg='red',
anchor='s',font=('隶书',13,'italic'),command=proword)
but1.pack(side='left')
but2=tk.Button(text='输入分数',width=8,
bd=3,fg='red', anchor='s',font=('隶书',13,'italic'),command=proint)
but2.pack(side='left',padx=5)
but3=tk.Button(text='退出',width=8,
bd=3,fg='red', anchor='s',font=('隶书',13,'italic'),command=quit)
but3.pack(side='left',padx=5)
top.mainloop()
(3)askretrycancel()
askretrycancel()函数在对话框中显示“重试”和“取消”按钮,其返回值分别为“Ture”或“False”。

(4)askyesnocancel()
askyesnocancel()函数在对话框中显示“是”、“否”和“取消”三个按钮,其返回值分别为“yes”、“no”或“None”。

2. 有返回值的消息对话框
(1)askokcancel()
askokcancel()函数在对话框中显示“确定”和“取消”按钮,其返回值分别为“Ture”或“False”。如图所示。

(2)askquestion()
askquestion()函数在对话框中显示“是”和“否”按钮,其返回值分别为“yes”或“no”。

#【例12】有返回值的消息对话框示例。
import tkinter
import tkinter.messagebox
def but_okcancel():
a = tkinter.messagebox.askokcancel('提示', '要执行此操作吗')
print(a)
def but_askquestion():
a = tkinter.messagebox.askquestion('提示', '要执行此操作吗')
print(a)
def but_trycancel():
a = tkinter.messagebox.askretrycancel('提示', '要执行此操作吗')
print(a)
def but_yesnocancel():
a = tkinter.messagebox.askyesnocancel('提示', '要执行此操作吗')
print(a)
root=tkinter.Tk()
root.title('消息对话框') # 标题
root.geometry('400x400') # 窗体大小
root.resizable(False, False) # 固定窗体
tkinter.Button(root, text='确定/取消对话框',command=but_okcancel).pack()
tkinter.Button(root, text='是/否对话框',command=but_askquestion).pack()
tkinter.Button(root, text='重试/取消对话框',command=but_trycancel).pack()
tkinter.Button(root, text='是/否/取消对话框',command=but_yesnocancel).pack()
root.mainloop()

3. 文件对话框filedialog
(1)导入文件对话框模块语句
import tkinter.filedialog
(2)获取文件对话框返回值
文件对话框的返回值为文件路径和文件名。
【例13】文件对话框filedialog应用示例。
编写程序代码如下:
import tkinter.filedialog
a = tkinter.filedialog.askopenfilename()
print(a)

4. 颜色选择对话框colorchooser
colorchooser.askcolor()提供一个用户选择颜色的界面。其返回值是一个二元组,第1个元素是选择的RGB颜色值,第2个元素是对应的十六进制颜色值。
【例14】颜色选择对话框示例。
编写程序代码如下:
import tkinter.colorchooser
from tkinter import *
a = tkinter.colorchooser.askcolor()
print(a)

#【例14(B)】颜色选择对话框示例(检测颜色)。
#编写程序代码如下:
import tkinter.colorchooser
from tkinter import *
col={"#ff0000":"红色",'#ffff00':"黄色",'#ffff00':"蓝色",'#ff00ff':"粉色",'#ff8000':"综色"}
win = tkinter.Tk ()#定义窗体标题
win.title('颜色选择对话框示例')
win.geometry('250x120') # 定义窗体的大小400x200像素
k=16
a = tkinter.colorchooser.askcolor()
print(a)
c1=a[1]
if ( c1 in col ):
print("颜色码: ",c1,"颜色: ",col[c1])
else:
print("颜色码: ",c1 )
label = tkinter.Label(win,text ='欢迎进入 Python 世界!',font='song-'+str(k),fg=c1) # fg='#00ffff'
label.pack()

