当前位置: 首页 > news >正文

《零基础入门学习Python》第073讲:GUI的终极选择:Tkinter10

我们不难发现,几乎每一个应用程序都有一些相同的地方,比如说:标题栏、状态栏、边框、滚动条、工作区。还有的就是 菜单。

传统的菜单有大家熟悉的 File,Edit,Help等,点开之后,是下拉菜单,今天我们就来学习使用 tkinter 如何制作这样子的菜单。tkinter 提供了一个叫做 Menu 的组件,主要是用于实现顶级菜单、下拉菜单和弹出菜单。

由于该组件是由底层代码来实现的,并且已经优化好了,我们这里不建议你自行通过按钮或者其他的组件来实现菜单的功能,我知道你可以。但是Python的开发原则就是有得用,你就别自己瞎搞。我说的是正式开发中,在学习中,没事搞一搞是可以让我们学习到更多知识的。

我们先来实现创建一个顶级菜单:

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. def callback():

  4. print("你好~")

  5. menubar = tk.Menu(root)

  6. menubar.add_command(label = "hello", command = callback)

  7. menubar.add_command(label = "quit", command = root.quit)

  8. root.config(menu = menubar)#把创建的 menubar 与根窗口的 menu 绑定,才会显示菜单

  9. root.mainloop()

我们接下来实现下拉菜单,我们要实现下拉菜单,例如我们点一下 hello,它会出来很多其他的选项,而不是执行一个命令,方法也是大同小异的,只是说下拉菜单我们把它们添加到主菜单上,而不是窗口上,我们举例说明:

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. def callback():

  4. print("你好~")

  5. menubar = tk.Menu(root)

  6. ###创建文件菜单

  7. filemenu = tk.Menu(menubar)

  8. filemenu.add_command(label = "打开", command = callback)

  9. filemenu.add_command(label = "保存", command = callback)

  10. #我们还创建下拉菜单之间的分割线

  11. filemenu.add_separator()

  12. filemenu.add_command(label = "退出", command = root.quit)

  13. #创建级联菜单

  14. menubar.add_cascade(label = "文件", menu = filemenu)

  15. ###创建编辑菜单

  16. editmenu = tk.Menu(menubar, tearoff = False) #tearoff = False ,就是没有下拉菜单顶部的虚线

  17. editmenu.add_command(label = "剪切", command = callback)

  18. editmenu.add_command(label = "拷贝", command = callback)

  19. editmenu.add_command(label = "粘贴", command = root.quit)

  20. #创建级联菜单

  21. menubar.add_cascade(label = "编辑", menu = editmenu)

  22. root.config(menu = menubar)#把创建的 menubar 与根窗口的 menu 绑定,才会显示菜单

  23. root.mainloop()

我们来说一下 tearoff 的作用,tearoff 默认为 True,显性特点就是有一点虚线,当我们点击这一条虚线时:(菜单可以被撕下(tearoff))

我们再来说一个弹出菜单:

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. def callback():

  4. print("你好~")

  5. menubar = tk.Menu(root)

  6. menubar = tk.Menu(menubar)

  7. menubar.add_command(label = "撤销", command = callback)

  8. menubar.add_command(label = "退出", command = root.quit)

  9. frame = tk.Frame(root, width =512, height = 512)

  10. frame.pack()

  11. def popup(event):

  12. menubar.post(event.x_root, event.y_root)

  13. frame.bind("<Button-3>", popup) #<Button-3>就是鼠标右键

  14. root.mainloop()

运行后,点击鼠标右键:

菜单不仅可以添加我们普通的命令行(add_command),事实上我们还可以添加 像 Checkbutton(多选按钮)和 Radiobutton(单选按钮)这样子的菜单项,它们的用法就和  Checkbutton 和 Radiobutton 组件是差不多的。

我们继续创建一个带有 checkbutton 和 radiobutton 的菜单给大家看看:

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. def callback():

  4. print("你好~")

  5. menubar = tk.Menu(root)

  6. openVar = tk.IntVar()

  7. saveVar = tk.IntVar()

  8. quitVar = tk.IntVar()

  9. filemenu = tk.Menu(menubar, tearoff = False)

  10. filemenu.add_checkbutton(label = "打开", command = callback, variable = openVar)

  11. filemenu.add_checkbutton(label = "保存", command = callback, variable = saveVar)

  12. filemenu.add_separator()

  13. filemenu.add_checkbutton(label = "退出", command = root.quit, variable = quitVar)

  14. menubar.add_cascade(label = "文件", menu = filemenu)

  15. editVar = tk.IntVar()

  16. editmenu = tk.Menu(menubar, tearoff = False)

  17. editmenu.add_radiobutton(label = "剪切", command = callback, variable = editVar, value = 1)

  18. editmenu.add_radiobutton(label = "拷贝", command = callback, variable = editVar, value = 2)

  19. editmenu.add_radiobutton(label = "粘贴", command = root.quit, variable = editVar, value = 3)

  20. menubar.add_cascade(label = "编辑", menu = editmenu)

  21. root.config(menu = menubar)

  22. root.mainloop()

我们接下来介绍一个新的组件 Menubutton。

Menubutton 组件是一个与Menu 组件 相关联的按钮,(事实上就是Menu + Button),它可以放在窗口中的任意位置,并且在被按下时弹出下拉菜单。

这个组件是有一些历史意义的,因为刚开始是没有顶级菜单的,那么就用 Menubutton 实现一个个按钮在上面,点一个按钮就出现菜单。

现在该组件适用于你希望菜单按钮出现在其他位置的时候。

举个例子:

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. def callback():

  4. print("你好~")

  5. mb = tk.Menubutton(root, text = "点我", relief = "raised")

  6. mb.pack()

  7. filemenu = tk.Menu(mb, tearoff = False)

  8. filemenu.add_command(label = "打开", command = callback)

  9. filemenu.add_command(label = "保存", command = callback)

  10. filemenu.add_separator()

  11. filemenu.add_command(label = "退出", command = root.quit)

  12. mb.config(menu = filemenu)

  13. root.mainloop()

我们接下来 介绍一下 Optionmenu(选择菜单)。

OptionMenu(选择菜单)事实上是下拉菜单的改版,它的发明弥补了Listbox 组件无法实现下拉列表框的遗憾。因为事实上创建一个选择菜单,就跟一个下拉列表框是一个道理的。我们来看一下它实现的效果就知道了。

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. variable = tk.StringVar()

  4. variable.set("one")

  5. w = tk.OptionMenu(root, variable, "one", "two", "three")

  6. w.pack()

  7. root.mainloop()

最后,演示一下,如何将很多项添加到选择菜单中,就是很多选项在一个列表或者元组中,如何将他们添加到 OptionMenu 菜单中,

 
  1. import tkinter as tk

  2. OPTIONS = [

  3. "Wuhan",

  4. "Beijing",

  5. "Shanghai",

  6. "Tianjin",

  7. "Aomen",

  8. "Xianggang",

  9. "Hankou"

  10. ]

  11. root = tk.Tk()

  12. variable = tk.StringVar()

  13. variable.set(OPTIONS[0])

  14. w = tk.OptionMenu(root, variable, *OPTIONS) #*号有一个解包的功能,如果没有 * 号,就把整个列表当做一个选项了

  15. w.pack()

  16. root.mainloop()

注意:星号(*)作为形参的时候是起到“打包”的作用,相反,作为实参的时候是起到“解包”的作用。

一、星号(*)作为形参,表示调用可变参数函数:

通过在形参前加一个星号(*)或两个星号(**)来指定函数可以接收任意数量的实参。

 
  1. def fun1(*args):       

  2.         print(type(args)) 

  3.         print(args)

  4.         

  5. fun1(1, 2, 3, 4, 5)

  6. # 输出:

  7. # <class 'tuple'>

  8. # (1, 2, 3, 4, 5)

 
  1. def fun2(**args):

  2.         print(type(args))

  3.         print(args)

  4.         

  5. fun2(a=1, b=2, c=3, d=4, e=5)

  6. # 输出:

  7. # <class 'dict'>

  8. # {'e': 5, 'a': 1, 'c': 3, 'd': 4, 'b': 2}

  • 从两个示例的输出可以看出:当参数形如 *args 时,传递给函数的任意个实参会按位置打包成一个元组(tuple);
  • 当参数形如 **args 时,传递给函数的任意个 key = value 实参会被包装进一个字典(dict)。

二、星号(*)作为实参时,表示通过解包参数调用函数

有打包就有解包,通过在实参前加一个星号(*)或两个星号(**)来对列表(list)、元组(tuple)或字典(dict)进行解包:

 
  1. >>> a = [1, 2, 3, 4, 5]

  2. >>> b = (1, 2, 3, 4, 5)

  3. >>> fun1(*a)

  4. (1, 2, 3, 4, 5)

  5. >>> fun1(*b)

  6. (1, 2, 3, 4, 5)

  7. >>> c = {'one':1, 'two':2, 'three':3}

  8. >>> fun2(**c)

  9. {'two': 2, 'one': 1, 'three': 3}

  10. >>> 

总结:一个星号(*)用来打包和解包序列,两个星号(**)用来打包和解包字典。

相关文章:

《零基础入门学习Python》第073讲:GUI的终极选择:Tkinter10

我们不难发现&#xff0c;几乎每一个应用程序都有一些相同的地方&#xff0c;比如说&#xff1a;标题栏、状态栏、边框、滚动条、工作区。还有的就是 菜单。 传统的菜单有大家熟悉的 File&#xff0c;Edit&#xff0c;Help等&#xff0c;点开之后&#xff0c;是下拉菜单&#…...

Shell脚本实现分库分表操作

目录 一&#xff0c;分库备份 二&#xff0c;分库操作 三&#xff0c;分库分表备份 四&#xff0c;备份还原 一&#xff0c;分库备份 #!/bin/bash mysql_cmd-uroot -pzly666666 bak_path/backup/db [ -d ${bak_path} ] || mkdir -p ${bak_path}mysql ${mysql_cmd} -e show…...

区块链实验室(12) - 网络拓扑对PBFT共识流量的影响

区块链实验室(10) - 实例说明PBFT的共识过程说明了1个简单又极端的网络&#xff0c;在这个网络中完成1个交易的共识&#xff0c;需要26次通信&#xff0c;见下图所示。 换1个网络&#xff0c;这个网络是强连通图&#xff0c;见下图。 在这个网络中完成1次交易&#xff0c;流量见…...

聊聊这几年的科技风口

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 数数这几年的科技风口&#xff1a;AR&#xff08;包括什么MR、VR&#xff09;、区块链(包括后来的什么web3)、元宇宙到现在的AI&#xff0c;下面逐一谈谈…...

【力扣每日一题】2023.7.30 环形链表2

题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 这道题属于是那种知道解法就很简单&#xff0c;不知道解法就很难独立想出来的那种&#xff0c;我们只需要稍微记住这类题的固定解法就可以。 所以接下来我先说解法&#xff0c;再解释为什么解法可以解出来。 那么我们都…...

Flink状态的理解

Flink是一个带状态的数据处理系统&#xff1b;系统在处理数据的过程中&#xff0c;各算子所记录的状态会随着数据的处理而不断变化&#xff1b; 1. 状态 所谓状态State&#xff0c;一般指一个具体的 Task 的状态&#xff0c;即线程处理过程中需要保存的历史数据或历史累计数据…...

6.3.tensorRT高级(1)-yolov5模型导出、编译到推理(无封装)

目录 前言1. YOLOv5导出2. YOLOv5推理3. 补充知识总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-yolov5模…...

如何利用设备数字化平台推动精益制造?

人工智能驱动技术的不断发展&#xff0c;尤其是基于机器学习的预测分析工具的使用&#xff0c;为制造业带来了全新的效率和价值水平。一直以来&#xff0c;精益生产&#xff08;也叫精益制造&#xff09;在制造业中扮演着重要角色&#xff0c;而现在通过与工业 4.0的融合&#…...

使用Wps减小PDF文件的大小

第一步、打开左上角的文件 第二步、点击打印选项 第三步、点击打印按钮...

【深度学习】GPT-3

2020年5月&#xff0c;OpenAI在长达72页的论文《https://arxiv.org/pdf/2005.14165Language Models are Few-Shot Learners》中发布了GPT-3&#xff0c;共有1750亿参数量&#xff0c;需要700G的硬盘存储&#xff0c;(GPT-2有15亿个参数)&#xff0c;它比GPT-2有了极大的改进。根…...

在登录界面中设置登录框、多选项和按钮(HTML和CSS)

登录框&#xff08;Input框&#xff09;的样式&#xff1a; /* 设置输入框的宽度和高度 */ input[type"text"], input[type"password"] {width: 200px;height: 30px; }/* 设置输入框的边框样式、颜色和圆角 */ input[type"text"], input[type&q…...

【语音识别】- 声学,词汇和语言模型

一、说明 语音识别是指计算机通过处理人类语言的音频信号&#xff0c;将其转换为可理解的文本形式的技术。也就是说&#xff0c;它可以将人类的口语语音转换为文本&#xff0c;以便计算机能够进一步处理和理解。它是自然语言处理技术的一部分&#xff0c;被广泛应用于语音识别助…...

【考研英语语法及长难句】小结

【 考场攻略汇总 】 考点汇总 考场攻略 #1 断开长难句只看谓语动词&#xff0c;不考虑非谓语动词先找从句&#xff0c;先看主句 考场攻略 #2 抓住谓语动词&#xff0c;抓住句子最核心的表述动作或内容通过定位谓语动词&#xff0c;找到复杂多变的主语通过谓语动词的数量&…...

C# 反射

反射的概念&#xff1a;C#通过类型&#xff08;Type&#xff09;来创建对象&#xff0c;调用对象中的方法&#xff0c;属性等信息&#xff1b;B超就是利用了反射原理将超声波打在人的肚子上&#xff0c;然后通过反射波进行体内器官的成员&#xff1b; 反射提供的类&#xff1a;…...

Pytorch(二)

一、分类任务 构建分类网络模型 必须继承nn.Module且在其构造函数中需调用nn.Module的构造函数无需写反向传播函数&#xff0c;nn.Module能够利用autograd自动实现反向传播Module中的可学习参数可以通过named_parameters()返回迭代器 from torch import nn import torch.nn.f…...

Python 使用http时间同步设置系统时间源码

Python方式实现使用http时间同步设置系统时间源码&#xff0c;系统环境是ubuntu 12.04、Python2.7版本。需要使用到time、os及httplib方法。 Python使用http时间同步设置系统时间&#xff0c;源码如下&#xff1a; #-*-coding:utf8 -*- import httplib as client import time…...

golang sync.singleflight 解决热点缓存穿透问题

在 go 的 sync 包中&#xff0c;有一个 singleflight 包&#xff0c;里面有一个 singleflight.go 文件&#xff0c;代码加注释&#xff0c;一共 200 行出头。内容包括以下几块儿&#xff1a; Group 结构体管理一组相关的函数调用工作,它包含一个互斥锁和一个 map,map 的 key 是…...

4、Linux驱动开发:设备-设备号设备号注册

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…...

C++(MFC)调用Python

环境&#xff1a; phyton版本&#xff1a;3.10 VS版本&#xff1a;VS2017 包含文件头&#xff1a;Python\Python310\include 包含库文件&#xff1a;Python\Python310\libs 程序运行期间&#xff0c;以下函数只需要调用一次即可&#xff0c;重复调用会导致崩溃 void Initial…...

深度学习实践——循环神经网络实践

系列实验 深度学习实践——卷积神经网络实践&#xff1a;裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 代码可见于&#xff1a; 深度学习实践——循环神经网络实践 0 概况1 架构实现1.1 RNN架构1.1.1 RNN架…...

智能网络资源嗅探器:5步掌握专业级内容下载技巧

智能网络资源嗅探器&#xff1a;5步掌握专业级内容下载技巧 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在数字内容创作时…...

ComfyUI-Impact-Pack V8:AI图像细节增强的终极指南

ComfyUI-Impact-Pack V8&#xff1a;AI图像细节增强的终极指南 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目地址: https://git…...

【纳瓦尔宝典】财富篇精读:程序员实现财富自由的底层逻辑

本文是《纳瓦尔宝典》第一部分"财富"与第二部分"判断力"的完整精读笔记&#xff0c;专为程序员群体量身打造。结合技术职场实际&#xff0c;拆解每一个核心观点&#xff0c;提供可落地的行动指南。一、积累财富&#xff1a;不是靠打工&#xff0c;而是靠创…...

教师增强器:AI如何真正赋能一线教学而非替代教师

1. 这不是一场技术秀&#xff0c;而是一场教育现场的“静默革命”“AI正在重塑教育”——这句话听上去像极了科技发布会的开场白&#xff0c;但如果你真走进过北京某所公立小学的三年级语文课堂&#xff0c;或者旁听过深圳一所职校的数控编程实训课&#xff0c;你就会发现&…...

从官方例程到实际项目:AXI Timer v2.0在Zynq平台上的避坑指南与调试实录

从官方例程到实际项目&#xff1a;AXI Timer v2.0在Zynq平台上的避坑指南与调试实录 在嵌入式系统开发中&#xff0c;定时器是最基础也最关键的硬件外设之一。Xilinx提供的AXI Timer v2.0 IP核因其灵活的配置选项和丰富的功能特性&#xff0c;成为Zynq平台上实现精确时间控制的…...

3分钟告别网页图片格式烦恼:一键转换PNG/JPG/WebP的完整指南

3分钟告别网页图片格式烦恼&#xff1a;一键转换PNG/JPG/WebP的完整指南 【免费下载链接】Save-Image-as-Type Save Image as Type is an chrome extension which add Save as PNG / JPG / WebP to the context menu of image. 项目地址: https://gitcode.com/gh_mirrors/sa/…...

基于YOLOv8的AI自瞄项目完整配置指南

基于YOLOv8的AI自瞄项目完整配置指南 【免费下载链接】RookieAI_yolov8 基于yolov8实现的AI自瞄项目 AI self-aiming project based on yolov8 项目地址: https://gitcode.com/gh_mirrors/ro/RookieAI_yolov8 RookieAI_yolov8是一个基于YOLOv8目标检测技术实现的AI自瞄项…...

小白进阶挖洞大神 SRC 漏洞挖掘全流程实战指南

凌晨两点&#xff0c;大学生张三盯着电脑屏幕突然跳出的「高危漏洞奖励到账」提示&#xff0c;手抖得差点打翻泡面——这是他挖到人生第一个SRC漏洞&#xff08;某电商平台的越权访问漏洞&#xff09;后收到的第一笔奖金&#xff0c;金额足够支付三个月生活费。这样的故事&…...

JS逆向实战:加密库动态Hook的工程化落地方法

1. 这不是写个console.log就能搞定的事&#xff1a;为什么主流加密库的Hook总在关键时刻失效“JS逆向实战&#xff1a;一键Hook主流加密库的调试与拦截”——看到这个标题&#xff0c;很多刚入行的朋友第一反应是&#xff1a;“不就是给CryptoJS、SM2、RSA.js这些库的encrypt方…...

运算符的种类以及基本用法

一、算术运算符&#xff08;最基础&#xff09; 运算符名称示例说明加法358正数 / 加法运算-减法 / 负号5-32减法或表示负数&#xff08;如 -5&#xff09;*乘法3*515注意&#xff1a;不是 &#xff0c;是 */除法5/22整数除法舍去小数&#xff0c;5.0/22.5%取模&#xff08;取…...