草庐IT

Python 的Tkinter包系列之二:菜单

软件开发技术爱好者 2023-04-22 原文

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!

有关Python 的Tkinter包系列之二:菜单的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  3. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  6. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  7. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  8. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  9. 阿里云RDS——产品系列概述 - 2

    基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于

  10. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

随机推荐