先了解一下菜单
打开Windows 系统中“记事本”的界面,可以直观看到菜单:
在图形用户界面程序中, 菜单以图标和文字的方式展示可用选项。用鼠标选择一个选项, 程序的某个行为既被触发。这种行为通常包括比如 新建、打开、保存、退出等功能。
Tkinter的Menu菜单控件
15. The Menu widget
Tkinter的 Menu 控件提供了三种类型的菜单,分别是:toplevel(顶层菜单)、pull-down(下拉式菜单)、pop-up(弹出式菜单,或称快捷式菜单)。
1)顶层菜单
这种菜单是直接位于标题下面的固定菜单。
2)下拉菜单
当一个菜单有多个功能或者多个选择时,比如“记事本”,其中的文件菜单就有很多的功能,“打开文件”,“关闭文件”等等。窗口的大小是有限的,不能把所有的菜单项都做成顶层菜单,这个时候就需要下拉菜单。
3)弹出菜单
弹出菜单也称为快捷菜单,最常见是使用点击右键,在鼠标位置处弹出一个菜单。
使用构造函数【注:构造函数(constructor),是一种特殊的方法。主要用来在创建对象时初始化对象】创建Menu控件语法:
tk.Menu(master=None, **options)
返回菜单控件(widget:控件、组件、部件)。其中:
master -- 父控件,表示将菜单将建立在哪一个父对象上。
**options -- 控件选项,下方详细列举了各个选项的具体含义和用法:
选项 含义
activebackground 设置当 Menu 处于 "active" 状态(通过 state 选项设置状态)的背景色——当光标移至此菜单列表上时的背景色彩。
activeborderwidth 设置当 Menu 处于 "active" 状态(通过 state 选项设置状态)的边框宽度,默认是1。
activeforeground 设置当 Menu 处于 "active" 状态(通过 state 选项设置状态)的前景色。
background 设置背景颜色。
bg 跟 background 一样。
borderwidth 指定边框宽度。
bd 跟 borderwidth 一样。
cursor 指定当鼠标在 Menu 上飘过的时候的鼠标样式。
disabledforeground 指定当 Menu 处于 "disabled" 状态的时候的前景色。
font 指定 Menu 中文本的字体。
foreground 设置 Menu 的前景色。
fg 跟 foreground 一样。
postcommand 将此选项与一个方法相关联,当菜单被打开的时候该方法将自动被调用.
relief 指定边框样式, 默认值是 "flat",另外你还可以设置 "sunken","raised","groove" 或 "ridge"。
selectcolor 指定当菜单项显示为单选按钮或多选按钮时选择中标志的颜色。
Tearoff 默认情况下(tearoff=1 或 True)显示“撕掉元素(tear-off element)”,将该选项设置为(tearoff=0 或 False)关闭这一特性。
tearoffcommand 如果你希望当用户“撕下”你的菜单时通知你的程序,那么你可以将该选项与一个方法相关联,那么当用户“撕下”你的菜单时,Tkinter 会带着两个参数去调用你的方法(一个参数是当前窗口的 ID,另一个参数是承载被“撕下”的菜单的窗口 ID)。
title 默认情况下,被“撕下”的菜单标题是其主菜单的名字,不过你也可以通过修改此项的值来修改标题。
下面是菜单控件常用的其它方法
add(kind, **options)
添加给定种类(kind)的新元素作为此菜单中的下一个可用选项。其中:
type 参数指定添加的菜单类型,可以是:"command","cascade","checkbutton","radiobutton" 或 "separator"
options 选项设置菜单的属性,下表列举了 options 可以使用的选项和具体含义:
选项 含义
accelerator 显示该菜单项的加速键(快捷键),例如 accelerator = "Ctrl+N",该选项仅显示,并没有实现加速键的功能(通过按键绑定实现)。
activebackground 设置当该菜单项处于 "active" 状态(通过 state 选项设置状态)的背景色。
activeforeground 设置当该菜单项处于 "active" 状态(通过 state 选项设置状态)的前景色。
background 设置该菜单项的背景颜色。
bitmap 指定显示到该菜单项上的位图。
columnbreak 从该菜单项开始另起一列显示。
command 将该选项与一个方法相关联,当用户点击该菜单项时将自动调用此方法。
compound 控制菜单项中文本和图像的混合模式:如果该选项设置为 "center",文本显示在图像上(文本重叠图像);如果该选项设置为 "bottom","left","right" 或 "top",那么图像显示在文本的旁边(如 "bottom",则图像在文本的下方。
font 指定文本的字体。
foreground 设置前景色。
hidemargin 是否显示菜单项旁边的空白。
image 指定菜单项显示的图片,该值应该是 PhotoImage,BitmapImage,或者能兼容的对象。
Label 指定菜单项显示的文本。
menu 该选项仅在 cascade 类型的菜单中使用,用于指定它的下级菜单。
offvalue 默认情况下,variable 选项设置为 1 表示选中状态,反之设置为 0; 设置 offvalue 的值可以自定义未选中状态的值。
onvalue 默认情况下,variable 选项设置为:1 表示选中状态,反之设置为 0。 设置 onvalue 的值可以自定义选中状态的值。
selectcolor 指定当菜单项显示为单选按钮或多选按钮时选择中标志的颜色。
selectimage 如果你在单选按钮或多选按钮菜单中使用图片代替文本,那么设置该选项指定被菜单项被选中时显示的图片。
state 跟 text 选项一起使用,用于指定哪一个字符画下划线(例如用于表示键盘快捷键)
underline 用于指定在该菜单项的某一个字符处画下划线:例如设置为 1,则说明在该菜单项的第 2 个字符处画下划线。
value 当菜单项为单选按钮时,用于标志该按钮的值,在同一组中的所有按钮应该拥有各不相同的值,通过将该值与 variable 选项的值对比,即可判断用户选中了哪个按钮,如在使用上有不懂具体可以参照 Radiobutton 组件的说明。
variable 当菜单项是单选按钮或多选按钮时,与之关联的变量,如在使用上有不懂具体可以参照:Checkbutton 和 Radiobutton 组件的说明。
add_cascade(**options)
-- 建立分层(级联)菜单,同时让此子功能列表与父菜单建立链接, 相当于 add("cascade", **options)
add_command(**options)
-- 添加一个普通的命令菜单项,相当于 add("command", **options)
add_separator(**options)
-- 添加一条分割线,相当于 add("separator", **options)
下面给出tkinter创建下拉菜单的基本步骤:
#先创建窗口:
import tkinter
root=tkinter.Tk()
#定义菜单命令项功能
def callFun():
print("“菜单项”被调用啦!")
#然后:
#(1)创建顶层菜单,还可指定它的下级菜单
menubar= tkinter.Menu(root)
menu1= tkinter.Menu(menubar, tearoff=False)
menubar.add_cascade(label="父菜单项1", menu=menu1)
menu2= tkinter.Menu(menubar, tearoff=False)
menubar.add_cascade(label="父菜单项2", menu=menu2)
#(2)添加子菜单项
menu1.add_command(label="子菜单项1",command=callFun)
menu1.add_command(label="子菜单项2",command=callFun)
#(3)关联窗口——显示菜单
root.config(menu = menubar)
下面给出具体菜单示例
例1、先看一个简单的菜单例子源码:
#创建一个简单的菜单例子
import tkinter as tk
root = tk.Tk()
#设置窗口大小和位置:窗口的宽与高,窗口距离屏幕的左边距和上边距
root.geometry('350x250+300+200')
#给窗口起一个名字,也就是窗口的名字
root.title("一个带菜单的tk窗体")
def callback():
print("“菜单项”被调用啦!")
#创建一个顶级菜单
menubar = tk.Menu(root)
menubar.add_command(label = "菜单项", command = callback)
menubar.add_command(label = "退出", command = root.destroy)
#显示菜单
root.config(menu = menubar)
#开启主循环,让窗口处于显示状态
root.mainloop()
程序运行效果:
例2、创建一个简单的下拉菜单例子源码:
#创建一个简单的下拉菜单例子
import tkinter as tk
root = tk.Tk()
#设置窗口大小和位置:窗口的宽与高,窗口距离屏幕的左边距和上边距
root.geometry('350x250+300+200')
#给窗口起一个名字,也就是窗口的名字
root.title("一个tk窗体")
def callback():
print("下拉子菜单被调用啦!")
# 创建一个顶级菜单
menubar = tk.Menu(root)
# 创建一个下拉菜单“文件”
filemenu = tk.Menu(menubar, tearoff=False)
menubar.add_cascade(label="文件", menu=filemenu)
filemenu.add_command(label="打开", command=callback)
filemenu.add_command(label="保存", command=callback)
filemenu.add_separator() # 分隔
filemenu.add_command(label="退出", command=root.destroy)
# 创建另一个下拉菜单“编辑”
editmenu = tk.Menu(menubar, tearoff=False)
menubar.add_cascade(label="编辑", menu=editmenu)
editmenu.add_command(label="剪切", command=callback)
editmenu.add_command(label="拷贝", command=callback)
editmenu.add_command(label="粘贴", command=callback)
#显示菜单
root.config(menu = menubar)
#开启主循环,让窗口处于显示状态
root.mainloop()
程序运行效果:
例3、创建下拉菜单带快捷键例子源码:
#创建一个下拉式菜单
from tkinter import *
import tkinter .messagebox
#创建主窗口
win = Tk()
win.config(bg='#87CEEB')
win.title("标题")
win.geometry('450x350+300+200')
#创建一个执行函数,点击下拉菜单中命令时执行,其中event=0(可改用*event)让菜单快捷键生效
def menuCommand(event=0):
tkinter .messagebox .showinfo("提示", "您正在使用下拉菜单功能")
#创建主目录菜单(顶级菜单)
mainmenu = Menu (win)
#在顶级菜单上新增"文件"菜单的子菜单,同时不添加分割线
filemenu = Menu (mainmenu, tearoff=False)
#新增"文件"菜单的菜单项,并使用 accelerator 设置菜单项的快捷键
filemenu.add_command (label="新建",command=menuCommand,accelerator="Ctrl+N")
filemenu.add_command (label="打开",command=menuCommand, accelerator="Ctrl+O")
filemenu.add_command (label="保存",command=menuCommand, accelerator="Ctrl+S")
# 添加一条分割线
filemenu.add_separator()
filemenu.add_command (label="退出",command=win. quit)
#在主目录菜单上新增"文件"选项,并通过menu参数与下拉菜单绑定
mainmenu.add_cascade (label="文件",menu=filemenu)
# 将主菜单设置在窗口上
win.config (menu=mainmenu)
# 绑定键盘事件,按下键盘上的相应的键时都会触发执行函数
win.bind ("",menuCommand)
win.bind ("", menuCommand)
win.bind ("",menuCommand)
win.bind ("", menuCommand)
win.bind ("", menuCommand)
win.bind ("",menuCommand)
# 显示主窗口
win.mainloop()
其中 win.bind ("
程序运行效果:
弹出菜单(pop-up menu)也称为快捷式菜单,下面介绍。
例4、创建弹出菜单(快捷式菜单)例子源码:
#创建快捷式(pop-up)菜单
from tkinter import *
import tkinter.messagebox
#创建主窗口
win = Tk()
#设置窗口大小和位置:窗口的宽与高,窗口距离屏幕的左边距和上边距
win.geometry('350x250+300+200')
#给窗口起一个名字,也就是窗口的名字
win.title("窗体标题")
#执行菜单命令,显示一个对话框
def doSomething() :
tkinter.messagebox .askokcancel ("菜单","你正在选择快捷式菜单命令")
#创建-个快捷 式菜单(pop-up)
popupmenu = Menu (win, tearoff=0)
#新增快捷式菜单的项目
popupmenu.add_command (label="复制",command=doSomething)
popupmenu.add_command (label="粘贴",command=doSomething)
popupmenu.add_command (label="剪切",command=doSomething)
popupmenu.add_command (label="删除",command=doSomething)
#在单击鼠标右键的窗口(x,y)坐标处,显示此快捷式菜单
def showPopUpMenu(event) :
popupmenu .post (event.x_root, event.y_root)
#设置单击鼠标右键后,显示此快捷式菜单
win.bind("", showPopUpMenu)
#开始程序循环——显示主窗口
win.mainloop()
程序运行效果:
OK!