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

上节课我们介绍了Text组件的Indexs 索引和 Marks 标记,它们主要是用于定位,Marks 可以看做是特殊的 Indexs,但是它们又不是完全相同的,比如在默认情况下,你在Marks指定的位置中插入数据,Marks 的位置会自动发生改变, 因为Marks 认它后面的“那个家伙”,当 Marks 前面的数据被删除时,Marks 并不会被删除,它的位置只是相应的向前移动了,只有 mark_unset() 方法 才能够删除Marks,这节课我们接着来介绍 Tags 的用法。

Tags(标签)通常用于改变 Text 组件中内容的样式和功能。你可以修改文本的字体、尺寸和颜色。另外,Tags 还允许你将文本、嵌入的组件和图片与键盘和鼠标等事件相关联。除了 user-defined tags(用户自定义的 Tags),还有一个预定义的特殊 Tag:SEL。

SEL(或 "sel")用于表示对应的选中内容(如果有的话)。

你可以自定义任意数量的 Tags,Tags 的名字是由普通字符串组成,可以是除了空白字符外的任何字符。另外,任何文本内容都支持多个 Tags 描述,任何 Tag 也可以用于描述多个不同的文本内容。

我们来举个例子:

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. text = tk.Text(root, width=40, height=5,)

  4. text.pack()

  5. text.insert("insert", 'I love Python.com')

  6. text.tag_add("tag1", "1.7", "1.13", "1.15")

  7. text.tag_config("tag1", background = "yellow", foreground = "red")

  8. root.mainloop()

还有一点需要注意的是:如果你对同一个范围内的文本加上多个 Tags,并且设置相同的选项,那么新创建的 Tag 样式会覆盖比较旧的 Tag:

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. text = tk.Text(root, width=40, height=5)

  4. text.pack()

  5. text.insert("insert", 'I love Python.com')

  6. text.tag_add("tag1", "1.7", "1.13", "1.15")

  7. text.tag_add("tag2", "1.7", "1.13", "1.15")

  8. text.tag_config("tag2", foreground = "green")

  9. text.tag_config("tag1", background = "yellow", foreground = "red")

  10. root.mainloop()

那么新创建的 Tag2 会覆盖比较旧的 Tag1 的相同选项, 注意,与下边的调用顺序没有关系

你或许想控制 Tags 间的优先级,这可以实现吗?完全没有问题!你可以使用 tag_raise() 和 tag_lower() 方法来提高和降低某个 Tag 的优先级。

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. text = tk.Text(root, width=40, height=5)

  4. text.pack()

  5. text.tag_config("tag1", background="yellow", foreground="red")

  6. text.tag_config("tag2", foreground="green")

  7. text.tag_lower("tag2")

  8. text.insert("insert", "I love Python!", ("tag2", "tag1"))

  9. root.mainloop()

另外 Tags 还支持事件绑定,使用的是 tag_bind() 的方法。

下边例子中我们将文本("Python.com")与鼠标事件进行绑定,当鼠标进入该文本段的时候,鼠标样式切换为 "arrow" 形态,离开文本段的时候切换回 "xterm" 形态。当触发鼠标“左键点击操作”事件的时候,使用默认浏览器打开Python的首页(Welcome to Python.org):

 
  1. import tkinter as tk

  2. import webbrowser

  3. root = tk.Tk()

  4. text = tk.Text(root, width=40, height=5)

  5. text.pack()

  6. text.insert("insert", "I love Python.com!")

  7. text.tag_add("link", "1.7", "1.17")

  8. text.tag_config("link", foreground = "blue", underline = True)

  9. def show_arrow_cursor(event):

  10. text.config(cursor = "arrow")

  11. def show_xterm_cursor(event):

  12. text.config(cursor = "xterm")

  13. def click(event):

  14. webbrowser.open("https://www.python.org/")

  15. text.tag_bind("link", "<Enter>", show_arrow_cursor)

  16. text.tag_bind("link", "<Leave>", show_xterm_cursor)

  17. text.tag_bind("link", "<Button-1>", click)

  18. root.mainloop()

接下来给大家介绍几个 Tags 使用上的技巧:

(一)判断内容是否发生变化

通过校检 Text 组件中文本的 MD5 摘要来判断内容是否发生改变

 
  1. import tkinter as tk

  2. import hashlib

  3. root = tk.Tk()

  4. text = tk.Text(root, width=40, height=5)

  5. text.pack()

  6. text.insert("insert", "I love Python.com!")

  7. contents = text.get("1.0", "end")

  8. def getSig(contents):

  9. m = hashlib.md5(contents.encode())

  10. return m.digest()

  11. sig = getSig(contents)

  12. def check():

  13. contents = text.get("1.0", "end")

  14. if sig != getSig(contents):

  15. print("警报:内容发生改变!")

  16. else:

  17. print("风平浪静")

  18. tk.Button(root, text = "检查", command = check).pack()

  19. root.mainloop()

(二)查找操作

使用 search() 方法可以搜索 Text 组件中的内容。但是传统的 search() 方法只查找到一个,就返回,我们可以加入一个循环,查找所有的。

 
  1. import tkinter as tk

  2. import hashlib

  3. root = tk.Tk()

  4. text = tk.Text(root, width=40, height=5)

  5. text.pack()

  6. text.insert("insert", "I love Python.com!")

  7. def getIndex(text, index):

  8. return tuple(map(int, str.split(text.index(index), ".")))

  9. start = "1.0"

  10. while True:

  11. pos = text.search("o", start, stopindex = "end")

  12. if not pos:

  13. break

  14. print("找到啦,位置是:", getIndex(text, pos))

  15. start = pos + "+1c"

  16. root.mainloop()

(三)恢复、撤销操作

Text 组件还支持“恢复”和“撤销”操作,这使得 Text 组件显得相当高大上。

通过设置 undo 选项为 True 可以开启 Text 组件的“撤销”功能。然后用 edit_undo() 方法实现“撤销”操作,用 edit_redo() 方法实现“恢复”操作。

 
  1. import tkinter as tk

  2. import hashlib

  3. root = tk.Tk()

  4. text = tk.Text(root, width=40, height=5, undo = True)

  5. text.pack()

  6. text.insert("insert", "I love Python.com!")

  7. def show():

  8. text.edit_undo()

  9. tk.Button(root, text = "撤销", command = show).pack()

  10. root.mainloop()

 Text 组件内部有一个栈专门用于记录内容的每次变动,所以每次“撤销”操作就是一次弹栈操作,“恢复”就是再次压栈。

默认情况下,每一次完整的操作将会放入栈中。但怎么样算是一次完整的操作呢?Tkinter 觉得每次焦点切换、用户按下 Enter 键、删除\插入操作的转换等之前的操作算是一次完整的操作。也就是说你连续输入“I love Python” 的话,一次的“撤销”操作就会将所有的内容删除。

那我们能不能自定义呢?比如我希望插入一个字符就算一次完整的操作,然后每次点击“撤销”就去掉一个字符。

当然可以!做法就是先将 autoseparators 选项设置为 False(因为这个选项是让 Tkinter 在认为一次完整的操作结束后自动插入“分隔符”),然后绑定键盘事件,每次有输入就用 edit_separator() 方法人为地插入一个“分隔符”:

 
  1. import tkinter as tk

  2. import hashlib

  3. root = tk.Tk()

  4. text = tk.Text(root, width=40, height=5, undo = True, autoseparators = False)

  5. text.pack()

  6. text.insert("insert", "I love Python.com!")

  7. def callback(event):

  8. text.edit_separator() #人为插入分隔符

  9. text.bind('<Key>', callback)

  10. def show():

  11. text.edit_undo()

  12. tk.Button(root, text = "撤销", command = show).pack()

  13. root.mainloop()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAMBA 文件分享相关 笔记

目标说明 在Linux 安装Samba&#xff0c;然后在Windows端映射为网络硬盘 流程 Linux 端命令 apt install samba -y 默认情况下软件会询问是否迁移系统网络设置以搭建协议&#xff0c;选择迁移即可修改配置文件 vim /etc/samba/smb.conf Samba 的配置文件中会带一个名为 prin…

[VRTK4.0]将Unity输入系统与VRTKv4结合使用

学习目标&#xff1a; 展示了如何在Unity项目中设置Unity输入系统&#xff0c;以及如何导入输入系统Tilia包以支持VRTKTilia包与新的Unity输入系统操作一起工作。 流程&#xff1a; 步骤一&#xff1a; 首先我们需要再次检查项目设置是否具有新的Unity输入系统。通过Project S…

JAVA SE -- 第十三天

&#xff08;全部来自“韩顺平教育”&#xff09; 集合 一、集合框架体系 集合主要是两组&#xff08;单列集合、双列集合&#xff09; Collection接口有两个重要的子接口List 、Set&#xff0c;它们的实现子类都是单列集合 Map接口的实现子类是双列集合&#xff0c;存放的…

Java019-1——面向对象的三大特性

一、封装性 将类的某些信息隐藏在类内部&#xff0c;不允许外部程序直接访问&#xff0c;而是通过该类提供的方法来实现对隐藏信息的操作和访问。&#xff08;这里说的信息就是类中的属性和方法&#xff09; 1.1、封装性的体现 想要通过代码体现封装性之前&#xff0c;需要先…

使用vscode+platformio搭建arduino开发环境

存在的问题&#xff1a; Arduino编译时会将所有的C文件都编译一遍造成编译很慢&#xff0c;一个简单的工程稍加修改有可能都需要三四分钟才能编译完成&#xff0c;同时arduino也不支持代码跳转查看功能&#xff0c;不方便代码查看。 解决方法&#xff1a; 使用vscodeplatfor…

【c++】类和对象

类和对象 面向过程和面向对象的初步认识 我们用军事为例&#xff0c;要完成一次作战&#xff0c;需要侦察、后勤保障、战略部署、战术部署...等等 面向过程&#xff1a; 更加关注过程&#xff0c;关注如何侦察&#xff08;无人机侦察、火力侦察、侦察小组侦察&#xff09;&…

vue 文件扩展名中 esm 、common 、global 以及 mini 、 dev 、prod 、runtime 的含义

vue 文件扩展名中 esm 、common 、global 以及 mini 、 dev 、prod 、runtime 的含义 vue.js 直接用在 script 标签中的完整版本&#xff08;同时包含编译器 compiler 和运行时 runtime&#xff09;&#xff0c;可以看到源码&#xff0c;适用于开发环境。 这个版本视图可以写在…

微服务的各种边界在架构演进中的作用

演进式架构 在微服务设计和实施的过程中&#xff0c;很多人认为&#xff1a;“将单体拆分成多少个微服务&#xff0c;是微服务的设计重点。”可事实真的是这样吗&#xff1f;其实并非如此&#xff01; Martin Fowler 在提出微服务时&#xff0c;他提到了微服务的一个重要特征—…

【Chat GPT】用 ChatGPT 运行 Python

前言 ChatGPT 是一个基于 GPT-2 模型的人工智能聊天机器人&#xff0c;它可以进行智能对话&#xff0c;同时还支持 Python 编程语言的运行&#xff0c;可以通过 API 接口进行调用。本文将介绍如何使用 ChatGPT 运行 Python 代码&#xff0c;并提供一个实际代码案例。 ChatGPT …

【雕爷学编程】MicroPython动手做(18)——掌控板之声光传感器2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

[php-cos]ThinkPHP项目集成腾讯云储存对象COS

Cos技术文档 1、安装phpSdk 通过composer的方式安装。 1.1 在composer.json中添加 qcloud/cos-sdk-v5: >2.0 "require": {"php": ">7.2.5","topthink/framework": "^6.1.0","topthink/think-orm": "…

Oracle 19c 报ORA-704 ORA-01555故障处理---惜分飞

异常断电导致数据库无法启动,尝试对数据文件进行recover操作,报ORA-00283 ORA-00742 ORA-00312错误,由于redo写丢失无法正常应用 D:\check_db>sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on 星期日 7月 30 07:49:19 2023 Version 19.3.0.0.0 Copyrig…

NoSQL-Redis集群

NoSQL-Redis集群 一、集群&#xff1a;1.单点Redis带来的问题&#xff1a;2.解决&#xff1a;3.集群的介绍&#xff1a;4.集群的优势&#xff1a;5.集群的实现方式&#xff1a; 二、集群的模式&#xff1a;1.类型&#xff1a;2.主从复制&#xff1a; 三、搭建主从复制&#xff…

阿里云服务器全方位介绍_性能功能优势和租用费用

阿里云服务器全方位介绍包括云服务器ECS优势、云服务器租用价格、云服务器使用场景及限制说明&#xff0c;阿里云服务器网分享云服务器ECS介绍、个人和企业免费试用、云服务器活动、云服务器ECS规格、优势、功能及应用场景详细说明&#xff1a; 目录 什么是云服务器ECS&#…

细讲TCP三次握手四次挥手(三)

TCP/IP 协议族 在互联网使用的各种协议中最重要和最著名的就是 TCP/IP 两个协议。现在人们经常提到的 TCP/IP 并不一定是单指 TCP 和 IP 这两个具体的协议&#xff0c;而往往是表示互联网所使用的整个 TCP/IP 协议族。 互联网协议套件&#xff08;英语&#xff1a;Internet Pr…

29_互联网(The Internet)(IP数据包;UDP;TCP;DNS;OSI)

上篇介绍了计算机网络的基础知识&#xff0c;也提到互联网&#xff08;The Internet&#xff09;&#xff0c;本篇将会详细介绍互联网&#xff08;The Internet&#xff09;。 文章目录 1. 互联网&#xff08;The Internet&#xff09;组成及数据包传输过程2. IP 数据包的不足3…

【AGI】Copilot AI编程辅助工具安装教程

1. 基础激活教程 GitHub和OpenAI联合为程序员们送上了编程神器——GitHub Copilot。 但是&#xff0c;Copilot目前不提供公开使用&#xff0c;需要注册账号通过审核&#xff0c;我也提交了申请&#xff1a;这里第一期记录下&#xff0c;开启教程&#xff0c;欢迎大佬们来讨论…

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

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

医疗小程序:提升服务质量与效率的智能平台

在医疗行业&#xff0c;公司小程序成为提高服务质量、优化管理流程的重要工具。通过医疗小程序&#xff0c;可以方便医疗机构进行信息传播、企业展示等作用&#xff0c;医疗机构也可以医疗小程序提供更便捷的预约服务&#xff0c;优化患者体验。 医疗小程序的好处 提升服务质量…

【时频分析,非线性中频】非线性STFT在瞬时频率估计中的应用(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…