Python Tkinter包系列之二:菜单

先了解一下菜单

打开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 ("<Control-n>",menuCommand)
win.bind ("<Control-N>", menuCommand)
win.bind ("<Control-o>",menuCommand)
win.bind ("<Control-O>", menuCommand)
win.bind ("<Control-s>", menuCommand)
win.bind ("<Control-S>",menuCommand)
# 显示主窗口
win.mainloop()

其中 win.bind ("<Control-n>",menuCommand)等语句含义,可参见Python 的Tkinter包系列之五:事件_软件开发技术爱好者的博客-CSDN博客

程序运行效果:

弹出菜单(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("<Button-3>", showPopUpMenu)
#开始程序循环——显示主窗口
win.mainloop()

程序运行效果:

 OK!

Logo

华为云1024程序员节送福利,参与活动赢单人4000元礼包,更有热门技术干货免费学习

更多推荐