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

news2024/11/27 20:31:09

这节课的主要内容为  Listbox 组件、Scrollbar 组件 和 Scale 组件

在之前的学习中,我们已经知道了,如果说提供选项给客户选择,那么有两种情况,单选的话,我们用 Radiobutton,多选的话,用Checkbutton,如果说提供的选项非常多,比如说选择你所在的城市,那么全国有好几百个城市,使用 Radiobutton 和 Checkbutton 这些组件直接导致的结果就是用户的界面根本就不够存放那么多按钮,这时候你就可以考虑使用我们今天要介绍的 Listbox 组件。

一、Listbox 组件

Listbox 是用列表框的形式给显示出来的,并且支持滚动条操作,所以对于诸如提供大量的选项这样的情况会更适用一些。

我们先来举个简单的例子:

 
  1. import tkinter as tk

  2. master = tk.Tk()

  3. theLB = tk.Listbox (master)

  4. theLB.pack()

  5. master.mainloop()

运行一下:

如你所见,刚开始创建出来的时候,是空的,里面什么都没有,没有任何选项,所以我们要做的第一件事就是给它添加选项,添加选项同样是用 insert() 方法, insert() 方法 有两个参数,第一个参数就是添加的位置,第二个参数就是添加的内容。

 
  1. import tkinter as tk

  2. master = tk.Tk()

  3. theLB = tk.Listbox (master)

  4. theLB.pack()

  5. theLB.insert(0, "Python")

  6. master.mainloop()

这就有一个选项了,我们接着添加,你这里可以使用 "end", "end" 表示最后一个位置。

 
  1. theLB.insert(0, "Python")

  2. theLB.insert("end", "来自江南的你")

当然啦,对于特别多的选项,我们肯定不建议这样做,我们用循环。

 
  1. import tkinter as tk

  2. master = tk.Tk()

  3. theLB = tk.Listbox (master)

  4. theLB.pack()

  5. for item in ["鸡蛋", "鸭蛋", "鹅蛋", "李狗蛋", "蛋蛋"]:

  6. theLB.insert("end", item)

  7. master.mainloop()

有插入就肯定有删除,删除的话,我们还是使用 delete() 方法,它有两个参数,第一个是 起始位置,第二个是 结束位置。如果只给定一个参数的话,就是指定这个参数对应的项目。

 
  1. for item in ["鸡蛋", "鸭蛋", "鹅蛋", "李狗蛋", "蛋蛋"]:

  2. theLB.insert("end", item)

  3. theLB.delete(1)

我们经常要做的就是选中哪一个,就删除哪一个。我们现在做一个例子,我们添加一个独立的按钮,作用就是删除用户选中的项目。

 
  1. import tkinter as tk

  2. master = tk.Tk()

  3. theLB = tk.Listbox (master)

  4. theLB.pack()

  5. for item in ["鸡蛋", "鸭蛋", "鹅蛋", "李狗蛋", "蛋蛋"]:

  6. theLB.insert("end", item)

  7. theButton = tk.Button(master, text = "删除",\

  8. command = lambda x = theLB : x.delete("active")) #"active"就是选中的选项

  9. theButton.pack()

  10. master.mainloop()

运行:

   

最后我们要说的就是Listbox 组件根据 selectmode 选项提供了四种不同的选择模式:"single"(单选)、"browse"(也是单选,但拖动鼠标或通过方向键可以直接改变选项)、"multiple"(多选)和 "extended"(也是多选,但需要同时按住 Shift 键或 Ctrl 键或拖拽鼠标实现)。默认是 "browse"。

 
  1. theLB = tk.Listbox (master, selectmode = "extended")

  2. theLB.pack()

大家可以每一个都试一下,感受一下效果。

选项一多啊,麻烦事就接踵而来,比如说,你发现 Listbox 默认只能显示 10个项目,但是你手头有 11 个项目,那怎么办?

我们来试一下:

 
  1. import tkinter as tk

  2. master = tk.Tk()

  3. theLB = tk.Listbox (master, selectmode = "extended")

  4. theLB.pack()

  5. for item in range(11):

  6. theLB.insert("end", item)

  7. master.mainloop()

只能通过鼠标滚轮才能迫使最后一个项目现身,这样子做往往很容易被用户所忽略。你又没有说下面有东西,谁知道呢?

这样的情况,有两种方法来解决这种尴尬。

第一个方法就是修改 height 选项。

height 选项 用法

1. 设置 Listbox 显示的行数(不是像素)
2. 默认值是 10

我们可以改一下:

theLB = tk.Listbox (master, selectmode = "extended", height = 11)

这样子就没问题了。

修改 height 选项的方法虽然可以达到我们的目的,但是如果项目太多,比如说我们要显示 1000 个,这个方法显然就不适用了。

还有一个更加灵活的方法 就是为 Listbox 添加滚动条。

二、Scrollbar 组件

我们接着就来谈谈 滚动条 组件。滚动条 虽然是一个独立的组件存在,但它几乎都是与其他组件配合使用。下面的例子我们演示如何使用垂直滚动条。

为了在某个组件上安装滚动条,你必须要做两件事:

1、设置该组件的 xscrollbarcommand 或者 yscrollbarcommand 选项为 Scrollbar 组件 的 set() 方法。

2、设置 Scrollbar 组件 的 command 选项 为该组件的 xview()  或者 yview() 方法。

说起来比较复杂,但做起来很简单,我们先来搞个滚动条出来:

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. sb = tk.Scrollbar(root)

  4. sb.pack()

  5. root.mainloop()

运行一下:

我们要把它填充到右边的位置:

sb.pack(side = "right", fill = "y")

然后我们就来增加一个 Listbox:

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. sb = tk.Scrollbar(root)

  4. sb.pack(side = "right", fill = "y")

  5. lb = tk.Listbox(root, yscrollcommand = sb.set)

  6. for i in range(200):

  7. lb.insert("end", i)

  8. lb.pack(side = "left", fill = "both")

  9. sb.config(command = lb.yview)

  10. root.mainloop()

运行一下:

工作原理:这事实上就是一个互联互通的过程,当用户操作滚动条进行滚动的时候,滚动条首先响应用户的滚动操作,接下来,通过 yview() 方法(Listbox 的内置方法),内容就会自动刷新,然后,如果是 Listbox 藜里面滚动,它就会调用 sb.set() 方法,同时修改滚动条的位置。


三、Scale 组件

既然说到滚动条,我们就来顺带说一下跟滚动条长得很相似的一个组件,叫做 Scale 组件。

我们先来看一下它是什么样的:

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. tk.Scale(root).pack()

  4. root.mainloop()

虽然它和滚动条长得像,同样都可以滚,都有滑块,都是条形的,但是它们的应用范围可是不一样的。Scale 组件主要是通过滑块来表示某个范围内的一个数字,你可以通过修改 选项 、设置范围以及分辨率(分辨率就是指的步长)。

我们来举个例子:

当你希望用户输入某个范围内的一个数字的时候,你可能会使用Entry 组件,但是Entry 组件不能限制一个范围,你只能给出提示,然后对得到的数字进行检测,这样不方便。你可以直接弄一个 Scale 组件,提供一个范围,然后用户就只能在这个范围内选择。

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. tk.Scale(root, from_= 0, to = 52).pack()

  4. tk.Scale(root, from_= 0, to = 200, orient = 'horizontal').pack() #orient = 'horizontal' 设置为水平,默认"vertical"是垂直

  5. root.mainloop()

获取滑块当前的位置,我们使用的是 get()方法,我们增加一个按钮,来试验一下:

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. s1 = tk.Scale(root, from_= 0, to = 52)

  4. s1.pack()

  5. s2 = tk.Scale(root, from_= 0, to = 200, orient = 'horizontal')

  6. s2.pack()

  7. def show():

  8. print(s1.get(), s2.get())

  9. tk.Button(root, text = "获取位置", command = show).pack()

  10. root.mainloop()

接下来,你还可以通过 resolution 选项 来控制它的步长,也就是精度;使用 tickinterval 选项 显示刻度。

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. tk.Scale(root, from_= 0, to = 52, tickinterval = 5, resolution = 5, length = 200).pack()

  4. tk.Scale(root, from_= 0, to = 200, tickinterval = 10, orient = 'horizontal', length = 600).pack()

  5. root.mainloop()

为了让所有的刻度都能够排列下去,我们通过 length 选项 设置 Scale 组件的长度 为 200 和 600 像素。

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

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

相关文章

笔记本电源适配器使用时发烫会有安全隐患吗?

笔记本电源适配器(充电器) 笔记本充电器内部是一个很大的电感结构,因其工作原理会产生一部分热能,所以部分发热是正常的,即使发热也会一直保持一定的温度。同时,充电器外壳都是耐高温的不会烧坏&#xff…

【MySQL】索引是什么东东?

书中的目录,就是充当索引的角色,方便我们快速查找书中的内容,所以索引是以空间换时间的设计思想。 索引和数据位于存储引擎中,MySQL默认的存储引擎是InnoDB。 1 为什么MySQL采用B树作为索引? 1.1 其他数据结构为什么…

C语言每日一题:6.移除元素+合并两个有序数组。

第一题:移除元素 思路一: 一:暴力查找的方法: 1.找到对应val值的下标,返回数组的下标。 2.删除对应的下标,从前向后用后面覆盖前面。当后一个是数组最后一个数值是就赋值结束了(注意数组越界的问…

【C++】开源:grpc远程过程调用(RPC)配置与使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍grpc远程过程调用(RPC)配置与使用。 无专精则不能成,无涉猎则不能通。。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜…

TikTok广告数据不好?收下这份常见问题自查手册!

你是一位跨境卖家吗?你是否在TikTok上投放过广告? 如果你的答案是肯定的,那么你可能遇到过一些困扰。比如,你的广告为什么不起量?为什么突然掉量了?为什么成本上升了?到底是哪里出了问题&#…

【MyBatis 学习三】子段不一致问题 多表查询 动态SQL

目录 一、解决Java实体类属性与数据库表字段不一致问题 🌷现象1:显示字段不对应:使用ResultType查询结果为null; 🌷解决办法:字段不对应:使用ResultMap解决。 二、数据库的多表查询 &#…

【【51单片机的红外遥控】】

红外遥控,完全把控 红外遥控 利用红外光进行通信的设备,由红外LED将调制后的信号发出,再由专门的红外接收头进行解调输出 通信方式:单工 异步 红外LED波长:940nm 通信协议标准:NEC标准 用那种一体化红红外…

面试总结-Redis篇章(八)——Redis分布式锁

JAVA 面试总结-Redis分布式锁 模拟抢券场景 通过下面方法添加Synchronized锁来防止上述情况,如果上面是单体服务没有问题,但是如果项目是集群部署,会出现下面的问题,因为Synchronized是属于本地的锁端口8080和8081同时访问&#x…

抽象工厂模式——产品族的创建

1、简介 1.1、简介 抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品 1.2、定义 抽象工厂模式(Abstract Factory Pattern):提供…

【MySQL】SQL优化(九)

🚗MySQL学习第九站~ 🚩本文已收录至专栏:MySQL通关路 ❤️文末附全文思维导图,感谢各位点赞收藏支持~ 一.插入数据 (1) 小规模数据 如果我们需要一次性往数据库表中插入多条记录: -- 例如我们需要插入大量数据 insert into t…

3.安装kubesphere

1.本地存储动态 PVC # 在所有节点安装 iSCSI 协议客户端(OpenEBS 需要该协议提供存储支持) yum install iscsi-initiator-utils -y # 设置开机启动 systemctl enable --now iscsid # 启动服务 systemctl start iscsid # 查看服务状态 systemctl status …

第三大的数

414、第三大的数 class Solution {public int thirdMax(int[] nums) {Arrays.sort(nums);int tempnums[0];int ansnums[0];int count 0;// if(nums.length<3){// return nums[nums.length-1];// }// else {for(int inums.length-1;i>0;i--){if (nums[i]>nums[i…

如何提高自己的软件测试水平之bug定位

同学们在面试投简历的时候会经常看到人家公司JD上写的要求之一&#xff0c;如下&#xff1a; 这句话大家不要以为随便写写的&#xff0c;在我工作的十几年过程中起码见过10个以上试用期没过的公司新人&#xff0c;公司在衡量一个测试工程师是否专业的标准之一就是&#xff1a;…

常用的数据结构 JAVA

目录 1、线性表2、栈&#xff1a;3、队列&#xff1a; 1、线性表 List<Object> narnat new ArrayList<>();ArrayList&#xff1a;动态数组 1、可以嵌套使用 2、add(x)添加元素x&#xff0c;remove(index)删除某个位置的元素 3、注意list是指向性的&#xff0c…

appium2.x 最新安装教程来了!不用再装 appium desktop 了!

前言 新的appium已经舍弃了appium-server&#xff0c;重新回归到只有命令行安装和启动appium服务。 本文是基于最新的appium2.x的安装教程。正想学习使用appium的不要错过。 1、安装最新版本的node.js 下载地址&#xff1a;https://nodejs.org/en&#xff0c;一路安装完成即…

SpringCloud学习笔记(五)ElasticSearch介绍

一、什么是ElasticSearch ElasticSearch是一款开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速找到需要的内容ElasticSearch结合kibana、Logstash、Beats&#xff0c;也就是elastic stack&#xff08;ELK&#xff09;。被广泛应用在日志数据分析、实时监控等领域Elasti…

JAVA 正则表达式(heima)

JAVA 正则表达式&#xff08;heima&#xff09; public class RegexDemo01 {/** 正则表达式介绍&#xff1a;本质来说就是一个字符串&#xff0c;字符串中可以指定规则&#xff0c;来对其他字符串进行校验。* public boolean matches(String regex):根据传入的正则表达式&#…

Jmap-JVM(十六)

上篇文章说了ZGC是jdk11加入的&#xff0c;他是未来jvm垃圾收集器的奠定者&#xff0c;满足TB级别内存处理&#xff0c;STW时间保持在10ms以下。 Jmap 我们可以先通过jmap -histo 进程ip 来查看&#xff0c;但是这样看不太清晰&#xff0c;我们可以用这行命令生成一个文件&…

Vue中TodoList案例_动画

MyItem.vue : 主要是引入了import animate.css样式库&#xff0c;animate.css样式库配置见上一篇文章animate.css样式库&#xff0c;然后再li标签外套了transition标签&#xff0c;引用了name里面的名称是animate.css拿过来的&#xff0c;绑定了enter-active-class和leave-act…

前端实现导出excel表格

需求&#xff1a;实现勾选行导出为表格 一、安装插件 npm install --save file-saver xlsx运行项目报如下警告的话 运行npm install xlsx0.16.0 --save 来降低版本号&#xff08;最初我安装的版本号是0.18.16的版本&#xff09;再次运行项目就不会报如下警告了 二、新建一个ex…