Tkinter创建菜单窗口

news2024/10/1 19:33:24

一、说明

        本文专门记录如何添加Tkinter的菜单,包括,菜单如何生成,菜单如何布局,菜单如何绑定回调函数,并安排代码示例,凡期望做菜单界面的读者,可以全面参考。

二、创建菜单实现步骤

2.1 总体规划模式

        菜单对象与其它Widget一样,需要create(parent)模式生成。但menu本身是个List框架,因此,可以安装嵌入下属menu,因此,通过list的嵌套,构成矩阵式菜单。

2.2 程序实现添加顶层菜单

1.Menu和其他的控件一样,第一个是父类,这里通常可以为窗口(父容器可为根窗体或其他容器控件实例)。有;两个必要步骤:

  1. 创建菜单,指定根控件。
  2. 在根配置此菜单
from tkinter import *

root = Tk()  # 设置主窗体
root.title('创建菜单概要')  # 设置窗体的名称
root.geometry('666x333')  # 设置窗体的大小
menutop = Menu(root)  # 父容器(top)为根窗体的实例

root.config(menu=menutop)  # 如果确实此句,则不会显示菜单分组
root.mainloop()

 2.3 程序向顶层菜单添加菜单项目

        我们可以利用add_command方法来为它添加菜单项,该菜单位于顶层,添加的菜单项依次向右添加:

menutop.add_command(label='文件')
menutop.add_command(label='操作')
menutop.add_command(label='帮助')

from tkinter import *

root = Tk()  # 设置主窗体
root.title('创建菜单概要')  # 设置窗体的名称
root.geometry('666x333')  # 设置窗体的大小
menutop = Menu(root)  # 父容器(top)为根窗体的实例

menutop.add_command(label='文件')
menutop.add_command(label='操作')
menutop.add_command(label='帮助')

root.config(menu=menutop)  # 如果确实此句,则不会显示菜单分组
root.mainloop()

        效果如图所示,添加的菜单项在顶层依次向右添加 

2.4 追加菜单的功能

        菜单的实际布局:

  • 每个root菜单实际是一个list,对应插入N个对象
  • 每个下级菜单实际是一个list,对应插入M个对象
  • 将root菜单的list存放下级菜单对象,构成菜单的 NxM 矩阵阵列,如下图.

from tkinter import *

def test():
    print("OK!")

root = Tk()  # 设置主窗体
root.title('创建菜单概要')  # 设置窗体的名称
root.geometry('666x333')  # 设置窗体的大小
menutop = Menu(root)  # 父容器(top)为根窗体的实例

menuFile = Menu(menutop) # 建立一个下拉菜单menuFile
menutop.add_cascade(label="文件", menu=menuFile)
menuFile.add_command(label="打开", command=test(), accelerator='Ctrl+N')
menuFile.add_command(label="保存", command=test(), accelerator='Ctrl+S')
menuFile.add_separator()  # 分割线
menuFile.add_command(label="退出", command=root.destroy, accelerator='Ctrl+Alt')

menuOppe = Menu(menutop) # 建立一个下拉菜单menuFile
menutop.add_cascade(label="编辑", menu=menuOppe)
menuOppe.add_command(label="插入", command=test(), accelerator='Ctrl+N')
menuOppe.add_command(label="删除", command=test(), accelerator='Ctrl+S')
menuOppe.add_separator()  # 分割线
menuOppe.add_command(label="撤销", command=root.destroy, accelerator='Ctrl+Alt')


root.config(menu=menutop)  # 如果确实此句,则不会显示菜单分组
root.mainloop()

执行以上代码,会出现如下状况:

我们发现,进入程序后,菜单命令被自动执行了!!

三、菜单响应函数add_command 

        注意:在menu菜单参数command=<想要调用的函数>中,需要在函数名前加上lambda:

  • 如果不写lambda的话,command调用的函数总是会自动执行
  • 如果操作函数有参数,也需要lambda函数传递。

        示例:

from tkinter import *

def test():
    print("OK!")

root = Tk()  # 设置主窗体
root.title('创建菜单概要')  # 设置窗体的名称
root.geometry('666x333')  # 设置窗体的大小
menutop = Menu(root)  # 父容器(top)为根窗体的实例

menuFile = Menu(menutop) # 建立一个下拉菜单menuFile
menutop.add_cascade(label="文件", menu=menuFile)
menuFile.add_command(label="打开", command=lambda : test(), accelerator='Ctrl+N')
menuFile.add_command(label="保存", command=lambda :test(), accelerator='Ctrl+S')
menuFile.add_separator()  # 分割线
menuFile.add_command(label="退出", command=root.destroy, accelerator='Ctrl+Alt')

menuOppe = Menu(menutop) # 建立一个下拉菜单menuFile
menutop.add_cascade(label="编辑", menu=menuOppe)
menuOppe.add_command(label="插入", command=lambda :test(), accelerator='Ctrl+N')
menuOppe.add_command(label="删除", command=lambda :test(), accelerator='Ctrl+S')
menuOppe.add_separator()  # 分割线
menuOppe.add_command(label="撤销", command=root.destroy, accelerator='Ctrl+Alt')


root.config(menu=menutop)  # 如果确实此句,则不会显示菜单分组
root.mainloop()

        这里修改了回调函数触发方式,以上缺点已经消除。



四、按钮菜单

4.1 关于菜单托盘Menubutton

        除了上述,将菜单部署到main窗口顶端,另一种菜单托盘可以将菜单部署到屏幕的其它位置。这是一个独特的菜单方式,是通过Menubutton做为菜单容器,生成类同于按钮的菜单项,与label、button一样停靠于窗口。

4.2 托盘菜单程序实现

from tkinter import *

root = Tk()
root.title("Profile Entry using Grid")
root.geometry("500x300")  # set starting size of window
root.maxsize(500, 300)  # width x height
root.config(bg="lightgrey")

# Profile picture
image = PhotoImage(file="grayqoon.png")
small_img = image.subsample(4,4)

img = Label(root, image=small_img)
img.grid(row=0, column=0, rowspan=6, padx=5, pady=5)

# Enter specific information for your profile into the following widgets
enter_info = Label(root, text="Please enter your information: ", bg="lightgrey")
enter_info.grid(row=0, column=1, columnspan=4, padx=5, pady=5)

# Name label and entry widgets
Label(root, text="Name", bg="lightgrey").grid(row=1, column=1, padx=5, pady=5, sticky=E)

name = Entry(root, bd=3)
name.grid(row=1, column=2, padx=5, pady=5)

# Gender label and dropdown widgets
gender = Menubutton(root, text="Gender")
gender.grid(row=2, column=2, padx=5, pady=5, sticky=W)
gender.menu = Menu(gender, tearoff=0)
gender["menu"] = gender.menu

# choices in gender dropdown menu
gender.menu.add_cascade(label="Male")
gender.menu.add_cascade(label="Female")
gender.menu.add_cascade(label="Other")
gender.grid()

# Eyecolor label and entry widgets
Label(root, text="Eye Color", bg="lightgrey").grid(row=3, column=1, padx=5, pady=5, sticky=E)
eyes = Entry(root, bd=3)
eyes.grid(row=3, column=2, padx=5, pady=5)

# Height and Weight labels and entry widgets
Label(root, text="Height", bg="lightgrey").grid(row=4, column=1, padx=5, pady=5, sticky=E)
Label(root, text="inches", bg="lightgrey").grid(row=4, column=3, sticky=W)

height = Entry(root, bd=3)
height.grid(row=4, column=2, padx=5, pady=5)

Label(root, text="Weight", bg="lightgrey").grid(row=5, column=1, padx=5, pady=5, sticky=E)
Label(root, text="lbs", bg="lightgrey").grid(row=5, column=3, sticky=W)

weight = Entry(root, bd=3)
weight.grid(row=5, column=2, padx=5, pady=5)

root.mainloop()

4.3 托盘菜单的效果 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1180489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023-11笔记

1.switch空指针异常 Exception in thread "main" java.lang.NullPointerException:Cannot invoke "String.hashCode()" because "<local2>" is nullat Study5.Test03.main(Test03.java:6)我们由此可以知道&#xff0c;switch语句部分情况下…

正点原子嵌入式linux驱动开发——Linux Regmap驱动

在前面学习I2C和SPI驱动的时候&#xff0c;针对I2C和SPI设备寄存器的操作都是通过相关的API函数进行操作的。这样Linux内核中就会充斥着大量的重复、冗余代码&#xff0c;但是这些本质上都是对寄存器的操作&#xff0c;所以为了方便内核开发人员统一访问I2C/SPI设备的时候&…

每日一题 2586. 统计范围内的元音字符串数(简单)

简单题&#xff0c;走流程 class Solution:def vowelStrings(self, words: List[str], left: int, right: int) -> int:ans 0for i in range(left, right 1):if words[i][0] in aeiou and words[i][-1] in aeiou:ans 1return ans

1300*B. Big Vova(最大公约数贪心)

Problem - 1407B - Codeforces 解析&#xff1a; 显然最大的数肯定放到第一个&#xff0c;然后对于之后每一个数&#xff0c;贪心考虑让其最大公约数最大即可。 时间复杂度log(n^2logn) #include<bits/stdc.h> using namespace std; #define int long long const int N…

qt多线程例子,不断输出数字

dialog.h #include "dialog.h" #include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog) {ui->setupUi(this); }Dialog::~Dialog() {delete ui; }// 启动线程按钮 void Dialog::on_startButton_clicked() {//conn…

springboot本地启动多个模块报错:Address already in use: JVM_Bind

目录 背景解决方法 背景 环境&#xff1a; jdk1.8 idea 2019.2.4idea本地启动多个模块联调时&#xff0c;提示报错&#xff1a; 错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 9090; nested exception is: java.net.BindException: Addre…

vue实现商品列表,组件抽离

1.需求说明 my-tag 标签组件封装 ​ (1) 双击显示输入框&#xff0c;输入框获取焦点 ​ (2) 失去焦点&#xff0c;隐藏输入框 ​ (3) 回显标签信息 ​ (4) 内容修改&#xff0c;回车 → 修改标签信息 my-table 表格组件封装 ​ (1) 动态传递表格数据渲染 ​ (2) 表头支…

电表采集器有抗干扰的能力吗?

电表采集器作为一种数据采集和远程通讯设备&#xff0c;广泛应用于电力、能源、工业等领域。在这些环境中&#xff0c;电表采集器面临着各种各样的电磁干扰&#xff0c;如高频干扰、脉冲干扰、电磁辐射等。为了确保电表采集器的稳定运行和数据准确性&#xff0c;抗干扰能力成为…

极智AI | GPT-4 Turbo登场

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文来介绍一下 GPT-4 Turbo登场。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq 今天,OpenAI 的首届开发者大会揭幕 (真的像科…

python-28-日志模块Loguru的应用

参考为什么不推荐使用Python原生日志库&#xff1f; 参考loguru&#xff0c;一个神奇的 python 库 Loguru 是一个旨在为 Python 带来愉快的日志记录的库&#xff0c;它可以完全增强你的日志记录体验&#xff0c;并且非常易于使用。 对logging及Loguru进行使用对比。 1 Loguru的…

L4级自动驾驶前装量产车型来了,小马智行与丰田联合打造

11月5日&#xff0c;小马智行与丰田汽车联合发布的首款纯电自动驾驶出租车&#xff08;Robotaxi&#xff09;概念车在第六届进博会亮相&#xff0c;该车型基于广汽丰田生产的bZ4X纯电车辆平台打造&#xff0c;将搭载小马智行研发的第七代L4级自动驾驶乘用车软硬件系统。 今年8月…

实测Java批量导入百万级数据

JAVA通过ThreadPoolTaskExecutor批量插入百万级数据 文章目录 JAVA通过ThreadPoolTaskExecutor批量插入百万级数据一、前言二、实现步骤1、application.yml添加线程池配置信息2、业务类&#xff0c;创建多线程批量插入具体业务方法3、spring容器注入线程池bean对象4、测试 三、…

leetcode:13. 罗马数字转整数(python3解法)

难度&#xff1a;简单 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M …

C/S架构的医学影像PACS系统源码,应用于放射、超声、内窥镜、病理等影像科室

C/S架构的PACS系统&#xff0c;采用DICOM3.0国际标准设计&#xff0c;以大型关系型数据库作为数据和图像的存储管理工具&#xff0c;是集医学影像的采集、传输、存储、查询、诊断、报告、综合信息管理等于一体的综合应用系统。 系统主要进行病人信息和影像的获取、处理、存储、…

windows10录屏神器,轻松保存高光时刻

录制电脑屏幕成了人们日常生活中经常需要面对的任务&#xff0c;无论是为了制作教程、保存游戏精彩瞬间&#xff0c;还是为了录制在线会议&#xff0c;一个功能强大、简单易用的录屏软件成为人们的迫切需求。在Windows 10操作系统下&#xff0c;有多种录屏方法可供选择。本文将…

如何查看苹果手机电池健康情况?快速查询方法来了!

使用苹果手机的小伙伴们&#xff0c;你们是否关心自己手机的电池健康状况&#xff1f;想随时掌握电池的使用状态&#xff0c;却不知道在哪里查看&#xff1f;本文将为大家提供有关苹果手机电池健康的简单查询方法&#xff0c;让您能够随时随地轻松掌握手机电池的健康状况。 操作…

sqlite3.NotSupportedError: deterministic=True requires SQLite 3.8.3 or higher

问题描述 sqlite3.NotSupportedError: deterministicTrue requires SQLite 3.8.3 or higher 解决方法 A kind of solution is changing the database from sqlite3 to pysqlite3. After acticate the virtualenv, install pysqlite. pip3 install pysqlite3 pip3 install …

CS免杀姿势

一&#xff1a;环境 1.公网vps一台 2.Cobalt Strike 4.7 3.免杀脚本 二&#xff1a;生成payload 生成一个payload c格式的x64位payload 三&#xff1a;免杀 下载免杀脚本 .c打开是这样的 把双引号里面的内容复制出来&#xff0c;放到脚本目录下的1.txt 运行生成器.…

刹车过电压保护

肖特基漏电流大&#xff0c;电池供电能省则省 最好是RCD缓冲&#xff0c;二极管要用快恢复 可以直接连&#xff0c;隔离可以用光耦或者逻辑门 问题4选的三极管Qg太大 问题九选的mos管Rdson太大 要并快恢复

蓝桥杯每日一题203.11.7

题目描述 题目分析 使用dp思维&#xff0c;当前位置是否可行是有上一位置推来&#xff0c;计算出最大的可行位置即可 #include <stdio.h> #include <string.h>#define N 256 int f(const char* s1, const char* s2) {int a[N][N];int len1 strlen(s1);int len2 …