《零基础入门学习Python》第073讲:GUI的终极选择:Tkinter10
我们不难发现,几乎每一个应用程序都有一些相同的地方,比如说:标题栏、状态栏、边框、滚动条、工作区。还有的就是 菜单。
传统的菜单有大家熟悉的 File,Edit,Help等,点开之后,是下拉菜单,今天我们就来学习使用 tkinter 如何制作这样子的菜单。tkinter 提供了一个叫做 Menu 的组件,主要是用于实现顶级菜单、下拉菜单和弹出菜单。
由于该组件是由底层代码来实现的,并且已经优化好了,我们这里不建议你自行通过按钮或者其他的组件来实现菜单的功能,我知道你可以。但是Python的开发原则就是有得用,你就别自己瞎搞。我说的是正式开发中,在学习中,没事搞一搞是可以让我们学习到更多知识的。
我们先来实现创建一个顶级菜单:
-
import tkinter as tk
-
root = tk.Tk()
-
def callback():
-
print("你好~")
-
menubar = tk.Menu(root)
-
menubar.add_command(label = "hello", command = callback)
-
menubar.add_command(label = "quit", command = root.quit)
-
root.config(menu = menubar)#把创建的 menubar 与根窗口的 menu 绑定,才会显示菜单
-
root.mainloop()
我们接下来实现下拉菜单,我们要实现下拉菜单,例如我们点一下 hello,它会出来很多其他的选项,而不是执行一个命令,方法也是大同小异的,只是说下拉菜单我们把它们添加到主菜单上,而不是窗口上,我们举例说明:
-
import tkinter as tk
-
root = tk.Tk()
-
def callback():
-
print("你好~")
-
menubar = tk.Menu(root)
-
###创建文件菜单
-
filemenu = tk.Menu(menubar)
-
filemenu.add_command(label = "打开", command = callback)
-
filemenu.add_command(label = "保存", command = callback)
-
#我们还创建下拉菜单之间的分割线
-
filemenu.add_separator()
-
filemenu.add_command(label = "退出", command = root.quit)
-
#创建级联菜单
-
menubar.add_cascade(label = "文件", menu = filemenu)
-
###创建编辑菜单
-
editmenu = tk.Menu(menubar, tearoff = False) #tearoff = False ,就是没有下拉菜单顶部的虚线
-
editmenu.add_command(label = "剪切", command = callback)
-
editmenu.add_command(label = "拷贝", command = callback)
-
editmenu.add_command(label = "粘贴", command = root.quit)
-
#创建级联菜单
-
menubar.add_cascade(label = "编辑", menu = editmenu)
-
root.config(menu = menubar)#把创建的 menubar 与根窗口的 menu 绑定,才会显示菜单
-
root.mainloop()
我们来说一下 tearoff 的作用,tearoff 默认为 True,显性特点就是有一点虚线,当我们点击这一条虚线时:(菜单可以被撕下(tearoff))
我们再来说一个弹出菜单:
-
import tkinter as tk
-
root = tk.Tk()
-
def callback():
-
print("你好~")
-
menubar = tk.Menu(root)
-
menubar = tk.Menu(menubar)
-
menubar.add_command(label = "撤销", command = callback)
-
menubar.add_command(label = "退出", command = root.quit)
-
frame = tk.Frame(root, width =512, height = 512)
-
frame.pack()
-
def popup(event):
-
menubar.post(event.x_root, event.y_root)
-
frame.bind("<Button-3>", popup) #<Button-3>就是鼠标右键
-
root.mainloop()
运行后,点击鼠标右键:
菜单不仅可以添加我们普通的命令行(add_command),事实上我们还可以添加 像 Checkbutton(多选按钮)和 Radiobutton(单选按钮)这样子的菜单项,它们的用法就和 Checkbutton 和 Radiobutton 组件是差不多的。
我们继续创建一个带有 checkbutton 和 radiobutton 的菜单给大家看看:
-
import tkinter as tk
-
root = tk.Tk()
-
def callback():
-
print("你好~")
-
menubar = tk.Menu(root)
-
openVar = tk.IntVar()
-
saveVar = tk.IntVar()
-
quitVar = tk.IntVar()
-
filemenu = tk.Menu(menubar, tearoff = False)
-
filemenu.add_checkbutton(label = "打开", command = callback, variable = openVar)
-
filemenu.add_checkbutton(label = "保存", command = callback, variable = saveVar)
-
filemenu.add_separator()
-
filemenu.add_checkbutton(label = "退出", command = root.quit, variable = quitVar)
-
menubar.add_cascade(label = "文件", menu = filemenu)
-
editVar = tk.IntVar()
-
editmenu = tk.Menu(menubar, tearoff = False)
-
editmenu.add_radiobutton(label = "剪切", command = callback, variable = editVar, value = 1)
-
editmenu.add_radiobutton(label = "拷贝", command = callback, variable = editVar, value = 2)
-
editmenu.add_radiobutton(label = "粘贴", command = root.quit, variable = editVar, value = 3)
-
menubar.add_cascade(label = "编辑", menu = editmenu)
-
root.config(menu = menubar)
-
root.mainloop()
我们接下来介绍一个新的组件 Menubutton。
Menubutton 组件是一个与Menu 组件 相关联的按钮,(事实上就是Menu + Button),它可以放在窗口中的任意位置,并且在被按下时弹出下拉菜单。
这个组件是有一些历史意义的,因为刚开始是没有顶级菜单的,那么就用 Menubutton 实现一个个按钮在上面,点一个按钮就出现菜单。
现在该组件适用于你希望菜单按钮出现在其他位置的时候。
举个例子:
-
import tkinter as tk
-
root = tk.Tk()
-
def callback():
-
print("你好~")
-
mb = tk.Menubutton(root, text = "点我", relief = "raised")
-
mb.pack()
-
filemenu = tk.Menu(mb, tearoff = False)
-
filemenu.add_command(label = "打开", command = callback)
-
filemenu.add_command(label = "保存", command = callback)
-
filemenu.add_separator()
-
filemenu.add_command(label = "退出", command = root.quit)
-
mb.config(menu = filemenu)
-
root.mainloop()
我们接下来 介绍一下 Optionmenu(选择菜单)。
OptionMenu(选择菜单)事实上是下拉菜单的改版,它的发明弥补了Listbox 组件无法实现下拉列表框的遗憾。因为事实上创建一个选择菜单,就跟一个下拉列表框是一个道理的。我们来看一下它实现的效果就知道了。
-
import tkinter as tk
-
root = tk.Tk()
-
variable = tk.StringVar()
-
variable.set("one")
-
w = tk.OptionMenu(root, variable, "one", "two", "three")
-
w.pack()
-
root.mainloop()
最后,演示一下,如何将很多项添加到选择菜单中,就是很多选项在一个列表或者元组中,如何将他们添加到 OptionMenu 菜单中,
-
import tkinter as tk
-
OPTIONS = [
-
"Wuhan",
-
"Beijing",
-
"Shanghai",
-
"Tianjin",
-
"Aomen",
-
"Xianggang",
-
"Hankou"
-
]
-
root = tk.Tk()
-
variable = tk.StringVar()
-
variable.set(OPTIONS[0])
-
w = tk.OptionMenu(root, variable, *OPTIONS) #*号有一个解包的功能,如果没有 * 号,就把整个列表当做一个选项了
-
w.pack()
-
root.mainloop()
注意:星号(*)作为形参的时候是起到“打包”的作用,相反,作为实参的时候是起到“解包”的作用。
一、星号(*)作为形参,表示调用可变参数函数:
通过在形参前加一个星号(*)或两个星号(**)来指定函数可以接收任意数量的实参。
-
def fun1(*args):
-
print(type(args))
-
print(args)
-
-
fun1(1, 2, 3, 4, 5)
-
# 输出:
-
# <class 'tuple'>
-
# (1, 2, 3, 4, 5)
-
def fun2(**args):
-
print(type(args))
-
print(args)
-
-
fun2(a=1, b=2, c=3, d=4, e=5)
-
# 输出:
-
# <class 'dict'>
-
# {'e': 5, 'a': 1, 'c': 3, 'd': 4, 'b': 2}
- 从两个示例的输出可以看出:当参数形如 *args 时,传递给函数的任意个实参会按位置打包成一个元组(tuple);
- 当参数形如 **args 时,传递给函数的任意个 key = value 实参会被包装进一个字典(dict)。
二、星号(*)作为实参时,表示通过解包参数调用函数
有打包就有解包,通过在实参前加一个星号(*)或两个星号(**)来对列表(list)、元组(tuple)或字典(dict)进行解包:
-
>>> a = [1, 2, 3, 4, 5]
-
>>> b = (1, 2, 3, 4, 5)
-
>>> fun1(*a)
-
(1, 2, 3, 4, 5)
-
>>> fun1(*b)
-
(1, 2, 3, 4, 5)
-
>>> c = {'one':1, 'two':2, 'three':3}
-
>>> fun2(**c)
-
{'two': 2, 'one': 1, 'three': 3}
-
>>>
总结:一个星号(*)用来打包和解包序列,两个星号(**)用来打包和解包字典。
相关文章:
![](https://img-blog.csdnimg.cn/20181226163058641.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTU2MzE4,size_16,color_FFFFFF,t_70)
《零基础入门学习Python》第073讲:GUI的终极选择:Tkinter10
我们不难发现,几乎每一个应用程序都有一些相同的地方,比如说:标题栏、状态栏、边框、滚动条、工作区。还有的就是 菜单。 传统的菜单有大家熟悉的 File,Edit,Help等,点开之后,是下拉菜单&#…...
![](https://img-blog.csdnimg.cn/963fa00b43fc46e2a38d19de675b3281.png)
Shell脚本实现分库分表操作
目录 一,分库备份 二,分库操作 三,分库分表备份 四,备份还原 一,分库备份 #!/bin/bash mysql_cmd-uroot -pzly666666 bak_path/backup/db [ -d ${bak_path} ] || mkdir -p ${bak_path}mysql ${mysql_cmd} -e show…...
![](https://img-blog.csdnimg.cn/94286a9131924c268a85dd93654ca5b3.png#pic_center)
区块链实验室(12) - 网络拓扑对PBFT共识流量的影响
区块链实验室(10) - 实例说明PBFT的共识过程说明了1个简单又极端的网络,在这个网络中完成1个交易的共识,需要26次通信,见下图所示。 换1个网络,这个网络是强连通图,见下图。 在这个网络中完成1次交易,流量见…...
![](https://www.oschina.net/img/hot3.png)
聊聊这几年的科技风口
作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 数数这几年的科技风口:AR(包括什么MR、VR)、区块链(包括后来的什么web3)、元宇宙到现在的AI,下面逐一谈谈…...
![](https://img-blog.csdnimg.cn/b6707003e2064d329cfa33e32e3fe462.gif)
【力扣每日一题】2023.7.30 环形链表2
题目: 示例: 分析: 这道题属于是那种知道解法就很简单,不知道解法就很难独立想出来的那种,我们只需要稍微记住这类题的固定解法就可以。 所以接下来我先说解法,再解释为什么解法可以解出来。 那么我们都…...
![](https://img-blog.csdnimg.cn/c25ea4a5edf64f43b43b9871746aec60.png)
Flink状态的理解
Flink是一个带状态的数据处理系统;系统在处理数据的过程中,各算子所记录的状态会随着数据的处理而不断变化; 1. 状态 所谓状态State,一般指一个具体的 Task 的状态,即线程处理过程中需要保存的历史数据或历史累计数据…...
![](https://img-blog.csdnimg.cn/79aa11bac2f3414abfdcc4b2b4e49104.png#pic_center)
6.3.tensorRT高级(1)-yolov5模型导出、编译到推理(无封装)
目录 前言1. YOLOv5导出2. YOLOv5推理3. 补充知识总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 高级-yolov5模…...
![](https://img-blog.csdnimg.cn/img_convert/d8e218d6847e0e601076aab8d0307bd1.jpeg)
如何利用设备数字化平台推动精益制造?
人工智能驱动技术的不断发展,尤其是基于机器学习的预测分析工具的使用,为制造业带来了全新的效率和价值水平。一直以来,精益生产(也叫精益制造)在制造业中扮演着重要角色,而现在通过与工业 4.0的融合&#…...
![](https://img-blog.csdnimg.cn/78df7f429a8c480b9b2c14312ff9fc6b.png)
使用Wps减小PDF文件的大小
第一步、打开左上角的文件 第二步、点击打印选项 第三步、点击打印按钮...
![](https://img-blog.csdnimg.cn/05fb2a3190c54fc8afd55f9f51ead610.png)
【深度学习】GPT-3
2020年5月,OpenAI在长达72页的论文《https://arxiv.org/pdf/2005.14165Language Models are Few-Shot Learners》中发布了GPT-3,共有1750亿参数量,需要700G的硬盘存储,(GPT-2有15亿个参数),它比GPT-2有了极大的改进。根…...
![](https://img-blog.csdnimg.cn/5a09d1a3238447d28fb8a4bbb08c8c0a.png)
在登录界面中设置登录框、多选项和按钮(HTML和CSS)
登录框(Input框)的样式: /* 设置输入框的宽度和高度 */ input[type"text"], input[type"password"] {width: 200px;height: 30px; }/* 设置输入框的边框样式、颜色和圆角 */ input[type"text"], input[type&q…...
![](https://img-blog.csdnimg.cn/img_convert/d82507d97c6764e9cd83df9eea6354d5.jpeg)
【语音识别】- 声学,词汇和语言模型
一、说明 语音识别是指计算机通过处理人类语言的音频信号,将其转换为可理解的文本形式的技术。也就是说,它可以将人类的口语语音转换为文本,以便计算机能够进一步处理和理解。它是自然语言处理技术的一部分,被广泛应用于语音识别助…...
![](https://img-blog.csdnimg.cn/b8dfe0891222410e890a1c8f57b44867.png)
【考研英语语法及长难句】小结
【 考场攻略汇总 】 考点汇总 考场攻略 #1 断开长难句只看谓语动词,不考虑非谓语动词先找从句,先看主句 考场攻略 #2 抓住谓语动词,抓住句子最核心的表述动作或内容通过定位谓语动词,找到复杂多变的主语通过谓语动词的数量&…...
![](https://www.ngui.cc/images/no-images.jpg)
C# 反射
反射的概念:C#通过类型(Type)来创建对象,调用对象中的方法,属性等信息;B超就是利用了反射原理将超声波打在人的肚子上,然后通过反射波进行体内器官的成员; 反射提供的类:…...
![](https://img-blog.csdnimg.cn/b4622b2fa9ab4a58b4ff31dfe6b31628.png)
Pytorch(二)
一、分类任务 构建分类网络模型 必须继承nn.Module且在其构造函数中需调用nn.Module的构造函数无需写反向传播函数,nn.Module能够利用autograd自动实现反向传播Module中的可学习参数可以通过named_parameters()返回迭代器 from torch import nn import torch.nn.f…...
![](https://www.ngui.cc/images/no-images.jpg)
Python 使用http时间同步设置系统时间源码
Python方式实现使用http时间同步设置系统时间源码,系统环境是ubuntu 12.04、Python2.7版本。需要使用到time、os及httplib方法。 Python使用http时间同步设置系统时间,源码如下: #-*-coding:utf8 -*- import httplib as client import time…...
![](https://www.ngui.cc/images/no-images.jpg)
golang sync.singleflight 解决热点缓存穿透问题
在 go 的 sync 包中,有一个 singleflight 包,里面有一个 singleflight.go 文件,代码加注释,一共 200 行出头。内容包括以下几块儿: Group 结构体管理一组相关的函数调用工作,它包含一个互斥锁和一个 map,map 的 key 是…...
![](https://img-blog.csdnimg.cn/img_convert/b02d4c186a413eb89ef81766d8b6f586.png)
4、Linux驱动开发:设备-设备号设备号注册
目录 🍅点击这里查看所有博文 随着自己工作的进行,接触到的技术栈也越来越多。给我一个很直观的感受就是,某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了,只有经常会用到的东西才有可能真正记…...
![](https://www.ngui.cc/images/no-images.jpg)
C++(MFC)调用Python
环境: phyton版本:3.10 VS版本:VS2017 包含文件头:Python\Python310\include 包含库文件:Python\Python310\libs 程序运行期间,以下函数只需要调用一次即可,重复调用会导致崩溃 void Initial…...
![](https://img-blog.csdnimg.cn/8b0033e2b8be4e77b9e645fc6ee4ae19.png)
深度学习实践——循环神经网络实践
系列实验 深度学习实践——卷积神经网络实践:裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 代码可见于: 深度学习实践——循环神经网络实践 0 概况1 架构实现1.1 RNN架构1.1.1 RNN架…...
![](https://img-blog.csdnimg.cn/a8cabafd6a4d4d8b85aed70e66bce7fd.png#pic_center)
docker简单web管理docker.io/uifd/ui-for-docker
要先pull这个镜像docker.io/uifd/ui-for-docker 这个软件默认只能使用9000端口,别的不行,因为作者在镜像制作时已加入这一层 刚下下来镜像可以通过docker history docker.io/uifd/ui-for-docker 查看到这个端口已被 设置 如果在没有设置br0网关时&…...
![](https://img-blog.csdnimg.cn/7cf2d857a3d348bf9d13df39946b860d.png)
SpringBoot内嵌的Tomcat:
SpringBoot内嵌Tomcat源码: 1、调用启动类SpringbootdemoApplication中的SpringApplication.run()方法。 SpringBootApplication public class SpringbootdemoApplication {public static void main(String[] args) {SpringApplication.run(SpringbootdemoApplicat…...
![](https://www.ngui.cc/images/no-images.jpg)
企业级docker应用注意事项
现在很多企业使用容器化技术部署应用,绕不开的docker技术,在生产环境docker常用操作总结。参考:https://juejin.cn/post/7259275893796651069 1. 尽可能使用官方镜像 在docker hub 官方 使用后面带有 DOCKER OFFICIAL IMAGE 标签的镜像&…...
![](https://www.ngui.cc/images/no-images.jpg)
腾讯云高性能计算集群CPU服务器处理器说明
腾讯云高性能计算集群以裸金属云服务器为节点,通过RDMA互联,提供了高带宽和极低延迟的网络服务,能满足大规模高性能计算、人工智能、大数据推荐等应用的并行计算需求,腾讯云服务器网分享腾讯云服务器高性能计算集群CPU处理器说明&…...
![](https://img-blog.csdnimg.cn/img_convert/fe2c2fe861c3d0f98b2e19bb29aa3411.jpeg)
tinkerCAD案例:23.Tinkercad 中的自定义字体
tinkerCAD案例:23.Tinkercad 中的自定义字体 原文 Tinkercad Projects Tinkercad has a fun shape in the Shape Generators section that allows you to upload your own font in SVG format and use it in your designs. I’ve used it for a variety of desi…...
![](https://www.ngui.cc/images/no-images.jpg)
Box-Cox 变换
Box-cox 变化公式如下: y ( λ ) { y λ − 1 λ λ ≠ 0 l n ( y ) λ 0 y^{(\lambda)}\left\{ \begin{aligned} \frac{y^{\lambda} - 1}{\lambda} && \lambda \ne 0 \\ ln(y) && \lambda 0 \end{aligned} \right. y(λ)⎩ ⎨ ⎧λyλ−1ln…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux wc命令用于统计文件的行数,字符数,字节数
Linux wc命令用于计算字数。 利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。 语法 wc [-clw][–help][–version][文件…] 参数: -c或–b…...
![](https://img-blog.csdnimg.cn/img_convert/ec4f7fae820dbe823c280321290b7644.png)
Python读取多个栅格文件并提取像元的各波段时间序列数据与变化值
本文介绍基于Python语言,读取文件夹下大量栅格遥感影像文件,并基于给定的一个像元,提取该像元对应的全部遥感影像文件中,指定多个波段的数值;修改其中不在给定范围内的异常值,并计算像元数值在每一景遥感影…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux 之 wget curl
wget 命令 wget是非交互式的文件下载器,可以在命令行内下载网络文件 语法: wget [-b] url 选项: -b ,可选,background 后台下载,会将日志写入到 当前工作目录的wget-log文件 参数 url : 下载链…...
![](https://www.ngui.cc/images/no-images.jpg)
AngularJS 和 React区别
目录 1. 背景:2. 版本:3. 应用场景:4. 语法:5. 优缺点:6. 代码示例: AngularJS 和 React 是两个目前最为流行的前端框架之一。它们有一些共同点,例如都是基于 JavaScript 的开源框架,…...
做公司网站麻烦吗/潍坊网站建设解决方案
在看到了mongoTemplate的操作之后,觉得这种东西是很符合我们程序员世界的操作的,但是看到mysql的jdbc之后,瞬间一百万个小泥马从头飘过,所以就想自己实现一个mysql版本的upsert功能,有set与increase,decrease。实现操作…...
![](https://img-blog.csdnimg.cn/img_convert/69edeb1e345be327e395f7acad7ef7c2.jpeg)
电脑如何做穿透外网网站/如何制作一个网页页面
从域控架构到中央集成式架构,跨域融合已经加速到来,从单一域控制器,到多域融合中央计算,市场门槛进一步抬升,市场也进入新一轮「攻坚」阶段。 高工智能汽车研究院发布《2023-2025年智能网联产业趋势报告》显示&#x…...
![](https://img-blog.csdnimg.cn/img_convert/80ec96fdb8c53eaff8103741e9e8588b.png)
自己做网站写文章/搜索引擎网址有哪些
硕思logo设计师电脑版是一个很好用的logo创建应用。该应用只需置入相片并进行自定义设置,里面有图像渐变、文本效果、阴影、发光、斜角、倒影等各种各样的logo图片款式,令你能够轻易获得你创作的图片。硕思logo设计师电脑版软件特色1、操作简单的logo设计…...
![](https://images2017.cnblogs.com/blog/332990/201802/332990-20180209111748045-1510560368.png)
城乡建设环保部网站/seo经理
问题描述: SharePoint 运行状况分析器提示: 中文:数据库正在兼容性范围内运行,建议进行升级。 英文:Database running in compatibility range and upgrade recommended 此时去管理中心---升级和迁移---查看数据库状态…...
![](https://images2015.cnblogs.com/blog/822713/201510/822713-20151015151659444-1943127463.png)
字体网站/云南省最新疫情情况
经过查阅资料和自己的理解整理出来的,欢迎大家指教。Awake和Start对比awake比start先执行。当有多个类的时候,所有类的awake执行完了才会执行start。awake里面一般放初始化的属性值,获取组件等。start里面可以处理一些只执行一次的功能。比如…...
![](/images/no-images.jpg)
广州外贸营销型网站建设公司/精准营销通俗来说是什么
GitHub 18k Star 的Java工程师成神之路,不来了解一下吗! GitHub 18k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 18k Star 的Java工程师成神之路,真的真的不来了解一下吗! 相信很多人对Java中的…...