Python之tkinter 菜单 Menu_python tkinter menu-程序员宅基地

技术标签: tkinter  python  Python笔记  

菜单Menu 设计的基本概念

  窗口中一般会有菜单设计,菜单是一种下拉式窗体,在这中窗体中可以设计菜单列表。语法格式如下:

Menu(父对象, options, ...)

参数:

  • 第一个参数:父对象,表示这个菜单将建立在哪一个窗口内
  • 第二个参数:options,参数如下
参数 含义
activebackground 当光标移至此菜单列表上时的背景色彩
activeborderwidth 当被鼠标选取时它的外边框厚度
默认是1
activeforeground 当光标移至此菜单列表上时的前景色彩
bd 所有菜单列表的外边框厚度
默认是1
bg 菜单列表未被选取时的背景色彩
cursor 当菜单分离时,鼠标光标在列表上的外观
disabledforeground. 菜单列表是DISABLED时的颜色
font 菜单列表文字的字形
fg 菜单列表未被选取时的前景色彩
image 菜单的图标
tearoff 菜单上方的分割线。这是一个虚线,线条有分割线时tearoff值为True或1,此时菜单列表从位置1开始放置,同时可以让菜单分离,分离方式是开启菜单后单击分割线
如果将tearoff设为False或0时,此时不会显示分割线,也就是菜单无法分离,但是菜单列表将从位置0开始存放
add_cascade 建立分层菜单,同时让此子功能列表与父菜单建立链接
add_command 增加菜单列表
add_separator 增加菜单列表的分隔线
菜单Menu 设计的基本应用

例子

import tkinter


def show():
    label.config(text='I Like Python!')


root = tkinter.Tk()
root.geometry('150x120')

menu = tkinter.Menu(root)
menu.add_command(label='Hello', command=show)
menu.add_command(label='Exit', command=root.destroy)
# 显示菜单对象
root.config(menu=menu)

label = tkinter.Label(root)
label.pack(padx=5, pady=10)

root.mainloop()

运行结果:
在这里插入图片描述

  上述程序虽然可以执行,但是这并不是一个正规的菜单设计方式,正规的菜单设计方式是在最上方建立菜单类别,然后在各个菜单类别内建立相关子菜单列表,使用下拉式窗体显示

例子

import tkinter


def show():
    label.config(text='I Like Python!')


root = tkinter.Tk()
root.geometry('150x120')

# 建立最上层菜单
menuBar = tkinter.Menu(root)
# 建立菜单类别对象,并将此菜的类别命名file
menuFile = tkinter.Menu(menuBar)
# 建立分层菜单,让此子功能列表与父菜单建立链接
menuBar.add_cascade(label='file', menu=menuFile)
# 在file菜单内建立菜单列表
menuFile.add_command(label='New', command=show)
menuFile.add_command(label='Exit', command=root.destroy)
# 显示菜单对象
root.config(menu=menuBar)

label = tkinter.Label(root)
label.pack(padx=5, pady=10)

root.mainloop()

运行结果:
在这里插入图片描述

tearoff 参数

  由上面的小程序可以看出,下拉子菜单是有分割线的,不符合常理,很影响美观,这也是tearoff的默认值导致的,我们把分割线隐藏

例子

import tkinter


def show():
    label.config(text='I Like Python!')


root = tkinter.Tk()
root.geometry('150x120')

# 建立最上层菜单
menuBar = tkinter.Menu(root)
# 建立菜单类别对象,并将此菜的类别命名file,tearoff设置为False
menuFile = tkinter.Menu(menuBar, tearoff=False)
# 建立分层菜单,让此子功能列表与父菜单建立链接
menuBar.add_cascade(label='file', menu=menuFile)
# 在file菜单内建立菜单列表
menuFile.add_command(label='New', command=show)
menuFile.add_command(label='Exit', command=root.destroy)
# 显示菜单对象
root.config(menu=menuBar)

label = tkinter.Label(root)
label.pack(padx=5, pady=10)

root.mainloop()

运行结果:
在这里插入图片描述

菜单列表间加上分割线

  建立下拉菜单列表时,如果列表项目有很多,可以适当的使用add_separator()方法在菜单列表内加上分割线

例子

import tkinter


def show(i):
    label.config(text=i)


root = tkinter.Tk()
root.geometry('150x120')

# 建立最上层菜单
menuBar = tkinter.Menu(root)
# 建立菜单类别对象,并将此菜的类别命名file
menuFile = tkinter.Menu(menuBar, tearoff=False)
# 建立分层菜单,让此子功能列表与父菜单建立链接
menuBar.add_cascade(label='file', menu=menuFile)
# 在file菜单内建立菜单列表
menuFile.add_command(label='New', command=lambda: show('New'))
menuFile.add_command(label='Open', command=lambda: show('Open'))
menuFile.add_separator()
menuFile.add_command(label='Save', command=lambda: show('Save'))
menuFile.add_command(label='Exit', command=root.destroy)
# 显示菜单对象
root.config(menu=menuBar)

label = tkinter.Label(root)
label.pack(padx=5, pady=10)

root.mainloop()

运行结果:
在这里插入图片描述

建立多个菜单的应用

  一个实用的窗口应用程序在最上层menubar中应该会有很多组菜单类别,在先前的例子中只建立了file菜单的对象,所使用的方法如下:

menuBar = tkinter.Menu(root)
menuFile = tkinter.Menu(menuBar, tearoff=False)
menuBar.add_cascade(label='file', menu=menuFile)

如果想要建立多组菜单类别,所需要的就是增加设计上述第2行和第3行,然后用不同的名称取代即可

例子

import tkinter


def show(i):
    label.config(text=i)


root = tkinter.Tk()
root.geometry('150x120')

# 建立最上层菜单
menuBar = tkinter.Menu(root)
# 建立菜单类别对象,并将此菜的类别命名file
menuFile = tkinter.Menu(menuBar, tearoff=False)
# 建立分层菜单,让此子功能列表与父菜单建立链接
menuBar.add_cascade(label='file', menu=menuFile)
# 在file菜单内建立菜单列表
menuFile.add_command(label='New', command=lambda: show('New'))
menuFile.add_command(label='Open', command=lambda: show('Open'))
menuFile.add_separator()
menuFile.add_command(label='Save', command=lambda: show('Save'))
menuFile.add_command(label='Exit', command=root.destroy)

menuHelp = tkinter.Menu(menuBar, tearoff=False)
menuBar.add_cascade(label='help', menu=menuHelp)
menuHelp.add_command(label='Help', command=lambda: show('Help'))


# 显示菜单对象
root.config(menu=menuBar)

label = tkinter.Label(root)
label.pack(padx=5, pady=10)

root.mainloop()

运行结果:
在这里插入图片描述

Alt快捷键

  快捷键是某个菜单类别或是列表指令的英文字符串内为单一字母增加下划线,然后可以用Alt键先启动此功能,当菜单显示下划线字母时,可以直接按指定字母键启动该功能。设计方式是在下列两个方法内增加underline参数

add_cascade(..., underline=n)   # n代表第几个所有字母含下划线
add_command(..., underline=n)   # n代表第几个所有字母含下划线
  • add_cascade() 的underline是为菜单类别增加字母下划线
  • add_command() 的underline是为命令列表增加字母下划线

上述索引从0开始计算,当然,在将所选择的字母处理成带有下划线时,必须适度选择具有代表性的字母,通常会是字符串的第1个字母。

例如,File菜单可以选择FHelp可以选择H

例子

import tkinter


def show(i):
    label.config(text=i)


root = tkinter.Tk()
root.geometry('150x120')

# 建立最上层菜单
menuBar = tkinter.Menu(root)
# 建立菜单类别对象,并将此菜的类别命名file
menuFile = tkinter.Menu(menuBar, tearoff=False)
# 建立分层菜单,让此子功能列表与父菜单建立链接
menuBar.add_cascade(label='file', menu=menuFile, underline=0)
# 在file菜单内建立菜单列表
menuFile.add_command(label='New', command=lambda: show('New'), underline=0)
menuFile.add_command(label='Open', command=lambda: show('Open'), underline=0)
menuFile.add_separator()
menuFile.add_command(label='Save', command=lambda: show('Save'), underline=0)
menuFile.add_command(label='Exit', command=root.destroy, underline=0)

menuHelp = tkinter.Menu(menuBar, tearoff=False)
menuBar.add_cascade(label='help', menu=menuHelp, underline=0)
menuHelp.add_command(label='Help', command=lambda: show('Help'), underline=0)


# 显示菜单对象
root.config(menu=menuBar)

label = tkinter.Label(root)
label.pack(padx=5, pady=10)

root.mainloop()

运行结果:

按Alt键~~
在这里插入图片描述

Ctrl + 快捷键

  在设计菜单列表时,也可以在指令右边设计Ctrl + X之类的快捷键,要设计这类操作可以借助accelerator参数,然后再使用bind()方法绑定一起

例子

import tkinter


def show(event):
    label.config(text=event)


root = tkinter.Tk()
root.geometry('150x120')

# 建立最上层菜单
menuBar = tkinter.Menu(root)
# 建立菜单类别对象,并将此菜的类别命名file
menuFile = tkinter.Menu(menuBar, tearoff=False)
# 建立分层菜单,让此子功能列表与父菜单建立链接
menuBar.add_cascade(label='file', menu=menuFile)
# 在file菜单内建立菜单列表
menuFile.add_command(label='New', command=lambda: show('New'), accelerator='Ctrl+N')

# 显示菜单对象
root.config(menu=menuBar)
root.bind('<Control-n>', lambda event: show('New'))

label = tkinter.Label(root)
label.pack(padx=5, pady=10)

root.mainloop()

运行结果:
在这里插入图片描述

建立子菜单

建立菜单时所使用的的概念如下

menuBar = tkinter.Menu(root)
menuFile = tkinter.Menu(menuBar, tearoff=False)
menuBar.add_cascade(label='file', menu=menuFile)

建立子菜单时,就需要再次嵌套Menu就行

menuSave = tkinter.Menu(menuFile, tearoff=False)
menuFile.add_cascade(label='Save', menu=menuSave)
menuSave.add_command(label='Save As')
menuSave.add_command(label='Save Local')

例子

import tkinter


def show(event):
    label.config(text=event)


root = tkinter.Tk()
root.geometry('150x120')

# 建立最上层菜单
menuBar = tkinter.Menu(root)

# file菜单
menuFile = tkinter.Menu(menuBar, tearoff=False)
menuBar.add_cascade(label='file', menu=menuFile)
menuFile.add_command(label='New', command=lambda: show('New'))

# Save菜单与Save子菜单
menuSave = tkinter.Menu(menuFile, tearoff=False)
menuFile.add_cascade(label='Save', menu=menuSave)
menuSave.add_command(label='Save As', command=lambda: show('Save As'))
menuSave.add_command(label='Save Local', command=lambda: show('Save Local'))


menuFile.add_command(label='Exit', command=lambda: show('Exit'))

# 显示菜单对象
root.config(menu=menuBar)

label = tkinter.Label(root)
label.pack(padx=5, pady=10)

root.mainloop()

运行结果:
在这里插入图片描述

建立弹出式菜单

  当使用windows操作系统时,可以在桌面上单击鼠标右键,此时会弹出一个菜单,这就是弹出式菜单 Popup menu,有人将此菜单称为快捷菜单

  设计这类菜单与先前需要在窗口的menubar区建立菜单类别有一些差异,建立好Menu对象后,可以直接利用此对象建立指令列表,最后的单击鼠标右键操作绑定显示弹出菜单即可

例子

import tkinter


def show(event):
    label.config(text=event)


def showInfo(event):
    # 显示弹出式菜单,根据Windows窗口的绝对位置
    popupMenu.post(event.x_root, event.y_root)


root = tkinter.Tk()
root.geometry('150x120')

# 建立弹出式菜单对象
popupMenu = tkinter.Menu(root, tearoff=False)
# 弹出菜单内建立两个指令列表
popupMenu.add_command(label='New File', command=lambda: show('New File'))
popupMenu.add_command(label='Flush', command=lambda: show('Flush'))

# 右键绑定弹出菜单方法
root.bind('<Button-3>', showInfo)

label = tkinter.Label(root)
label.pack(padx=5, pady=10)

root.mainloop()

运行结果:
在这里插入图片描述

add_checkbutton()

  在设计菜单列表时,也可以将命令用复选框(checkbutton)方式表示。也称为Cheak menu button

例子

import tkinter


def show():
    if demo.get():
        # 显示
        label.pack(side=tkinter.BOTTOM, fill=tkinter.X)
    else:
        # 隐藏
        label.pack_forget()


root = tkinter.Tk()
root.geometry('150x120')

menu = tkinter.Menu(root)
fileMenu = tkinter.Menu(menu, tearoff=False)
menu.add_cascade(label='File', menu=fileMenu)

# 创建复选框按钮
demo = tkinter.BooleanVar()
demo.set(False)
fileMenu.add_checkbutton(label='Save', command=show, variable=demo)

# 创建是否显示的状态栏
demoLabel = tkinter.StringVar()
demoLabel.set('显示')
label = tkinter.Label(root, textvariable=demoLabel, relief='raised')

# 显示菜单对象
root.config(menu=menu)
root.mainloop()

运行结果:
在这里插入图片描述
谢谢观看,笔者会持续更新,如有错误或者建议,请私信我

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44168690/article/details/105102950

智能推荐

linux下载错误130,IPFire 2.21 Core Update 130发布下载,修复错误和安全更新-程序员宅基地

文章浏览阅读90次。IPFire 2.21核心更新130发布了,提供x86_64、i586、arm版本下载,这是一个紧急更新,包含各种错误修复和大量安全修复程序的版本,搭载Linux 4.14.103、gcc 7.3.0、samba 3.6.25组件,以下是更新的详细内容。IPFire 2.21 Core Update 130主要更新注:IPFire 2.21 Core Update 130包含以下软件包的安全更新,..._ipfire arm

处理海量小文件——本地文件读成sequenceFile文件_local.liststatus(new path)-程序员宅基地

文章浏览阅读1k次。个人观点:当处理海量小文件时,先将小文件进行sequenceFile操作或者类似操作处理,然后再上传到HDFS系统进行下一步的处理。(如有其它建议,欢迎留言)一、直接上传本地栅格数据将导致的问题根据栅格数据的特点,每层的图片个数都为上层数量的四倍。在第20层时,仅仅第20层的图片的数量达到了“2199023255552”张(世界地图在第一层被切成了两张图片,第二十层的数量为:4**7*2),且..._local.liststatus(new path)

排序算法_排序算法考察-程序员宅基地

文章浏览阅读1.7k次。寒小阳目录视图摘要视图订阅 找工作知识储备(3)---从头说12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用分类: 笔试面试基础知识 算法那些事儿2013-09-29 16:54 9366人阅读 评论(10) 收藏 举报12种排序算法原理代码图解flash视频对应笔试面_排序算法考察

数据结构篇-树与森林_森林中的兄弟关系-程序员宅基地

文章浏览阅读1.4k次,点赞28次,收藏22次。树是n (n≥0)个结点的有限集合,n=0时,称为空树,这是一种特殊情况。在二叉树中,如果是兄弟关系就在右边,如果是孩子就在左边 ,本质上,用二叉链表存储森林。上图这样一棵树的先根遍历顺序和二叉树的很像,按照二叉树的方法。上图这样一棵树的后根遍历顺序和二叉树的很像,按照二叉树的方法。中序遍历森林中第一棵树的根结点的子树森林。1)有且仅有一个特定的称为根的结点。_森林中的兄弟关系

Bayesian statistics-程序员宅基地

文章浏览阅读152次。文件夹1Bayesian model selection贝叶斯模型选择1奥卡姆剃刀Occams razor原理2Computing the marginal likelihood evidence2-1 BIC approximation to log marginal ..._a.students.guide.to.bayesian.statistics

用kali Linux暴力破解Windows RDP(3389号端口)_kali 3389-程序员宅基地

文章浏览阅读1.6w次,点赞7次,收藏58次。RDP是Windows的远程桌面协议。我们要暴力破解3389号端口的前提是对方的3389号端口是开放的,不过大多数情况下电脑是默认关闭的,即使有远程协助的需要也不一定非得要用到3389号端口,开启不仅容易被对方破解,还容易成为肉鸡如果你发现你的端口是开放的,那么我建议你还是关上吧。用nmap查看目标端口是否开放。..._kali 3389

随便推点

html把div做成透明背景,DIV半透明层 CSS来实现网页背景半透明-程序员宅基地

文章浏览阅读868次,点赞2次,收藏5次。DIV半通明完成,运用CSS完成DIV成半透明效果,CSS实现层与后台半通明成果。一、DIV CSS半通明底子介绍设置装备摆设DIV半通明CSS代码:div{filter:alpha(Opacity=80);-moz-opacity:0.5;opacity:0.5;}阐明: 1、filter:对win IE设置半通明滤镜成就,filter:alpha(Opacity=80)代表该对象80%半透明..._html 背景div层

关机恶搞小程序

当system函数的参数是"shutdown"时,它将会执行系统的关机命令。具体来说,的功能是向操作系统发送一个关机信号,请求关闭计算机。这将触发操作系统执行一系列的关机操作,包括关闭所有正在运行的程序、保存必要的系统信息、并最终关闭计算机的电源。需要注意的是,执行通常需要管理员权限,因为关机操作涉及到系统级别的资源管理。在不同的操作系统上,关机命令可能会有所不同,因此具体的实现细节可能会有所差异。总结来说,是一个用于触发计算机关机操作的命令,通过调用外部的关机命令来实现这一功能。通过改变。

mnist手写数字分类的python实现_TensorFlow的MNIST手写数字分类问题 基础篇-程序员宅基地

文章浏览阅读348次。本章节的阅读对象是对机器学习和 TensorFlow 都不太了解的新手.就像我们学习编程的第一步往往是学习敲出 "Hello World" 一样,机器学习的入门就要知道 MNIST.MNIST 是一个入门级的计算机视觉数据集,它包含各种手写数字图片:它也包含每一张图片对应的标签,告诉我们这个是数字几;比如,上面这四张图片的标签分别是 5, 0, 4, 1。在此教程中,我们将训练一个机器学习模型用于..._python 自己拍摄手写数字的图片。根据前面训练得到的分类器,自行设计数据预处理流

wxpython窗口跳转_WxPython-用按钮打开一个新窗口-程序员宅基地

文章浏览阅读2k次。我正在创建一个界面,我需要打开一个新的窗口,点击一个按钮。所以我创建了主窗口,创建了所有按钮,并在一个类下创建了新窗口。我不完全确定是否需要,但我也会包括这一部分信息。对python来说是新的,如果它充满了错误,那么很抱歉。如果有人也能回答在打开另一个窗口时如何隐藏主菜单,那就太好了。干杯。import wxversionwxversion.select("2.8")import wxclass ..._wxpython点击按钮出现新窗口

操作系统精选习题——第四章_系统抖动现象的发生由什么引起的-程序员宅基地

文章浏览阅读3.4k次,点赞3次,收藏29次。一.单选题二.填空题三.判断题一.单选题静态链接是在( )进行的。A、编译某段程序时B、装入某段程序时C、紧凑时D、装入程序之前Pentium处理器(32位)最大可寻址的虚拟存储器地址空间为( )。A、由内存的容量而定B、4GC、2GD、1G分页系统中,主存分配的单位是( )。A、字节B、物理块C、作业D、段在段页式存储管理中,当执行一段程序时,至少访问()次内存。A、1B、2C、3D、4在分段管理中,( )。A、以段为单位分配,每._系统抖动现象的发生由什么引起的

UG NX 12零件工程图基础_ug-nx工程图-程序员宅基地

文章浏览阅读2.4k次。在实际的工作生产中,零件的加工制造一般都需要二维工程图来辅助设计。UG NX 的工程图主要是为了满足二维出图需要。在绘制工程图时,需要先确定所绘制图形要表达的内容,然后根据需要并按照视图的选择原则,绘制工程图的主视图、其他视图以及某些特殊视图,最后标注图形的尺寸、技术说明等信息,即可完成工程图的绘制。1.视图选择原则工程图合理的表达方案要综合运用各种表达方法,清晰完整地表达出零件的结构形状,并便于看图。确定工程图表达方案的一般步骤如下:口分析零件结构形状由于零件的结构形状以及加工位置或工作位置的不._ug-nx工程图