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

news2024/11/16 7:54:38

虽然我们能用 tkinter 设计不少东西了,但是不少同学还是感觉对这个界面编程掌控得还不够多,说白了,就是我们现在还没办法随心所欲的去绘制我们想要的界面,但是不瞒你说,今天的这一节课将会给你的人生乃至人生观带来翻天覆地的变化,开个玩笑哈。

我们今天讲解 Canvas 组件,一个可以让你任性的组件,一个可以让你随心所欲去绘制界面的组件,Canvas 是一个通用的组件,通常用于显示以及编辑图形,你可以用它来绘制直线、三角形、矩形、多边形甚至是绘制其他的组件都可以。在 Canvas 上绘制对象,你可以使用 create_xxx() 的方法(xxx 表示对象类型,例如线段 line,矩形 rectangle,文本 text 等)。

举个例子:

首先,我们创建一个 Canvas 对象,叫做 w,这个对象来自于 root ,设置宽度 200,高度 100,如果就这样运行的话,得到的就是一个空白的画布,背景颜色和窗口的背景颜色是一样的,所以我们看不到它在哪里,我们可以通过设置它的 background ,设置为 white。

我们然后在它的水平方向上创建一根黄线,在中间垂直方向上绘制一条红色的虚线,然后在中间绘制一个蓝色的矩形。

黄色的横线,起点(0,50),终点(200,50),颜色填充为 yellow。

红色的垂线,起点(100,0),终点(100,100),颜色填充为 red,dash 用于绘制虚线。

dash 用法:

1. 绘制虚线
2. 该选项值是一个整数元组,元组中的元素分别代表短线的长度和间隔
3. 例如 (3, 5) 代表 3 个像素的短线和 5 个像素的间隔

绘制矩形,左下点(50,25),右上点(150,75),填充颜色为 blue

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. w = tk.Canvas(root, width = 200, height = 100, background = "white")

  4. w.pack()

  5. w.create_line(0, 50, 200, 50, fill = "yellow")

  6. w.create_line(100, 0, 100, 100, fill = "red", dash = (4, 4))

  7. w.create_rectangle(50, 25, 150, 75, fill = "blue")

  8. root.mainloop()

大家要注意的是:我们创建的 3 个对象(两条线,一个矩形),这些对象如果没有意外的情况,它会一直保留着,直到你去修改它们,它们就会被覆盖,例如这两条线,本来都是贯穿整个 Canvas 的,但是被矩形覆盖了,那么中间被覆盖的位置就看不到啦。

还有一些方法提供给我们对这些对象(称之为画布对象)进行修改,我们可以使用 coords(),itemconfig() 和 move() 方法。我们来分别演示一下:

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. w = tk.Canvas(root, width = 200, height = 100, background = "white")

  4. w.pack()

  5. line1 = w.create_line(0, 50, 200, 50, fill = "yellow")

  6. line2 = w.create_line(100, 0, 100, 100, fill = "red", dash = (4, 4))

  7. rect1 = w.create_rectangle(50, 75, 150, 25, fill = "blue")

  8. w.coords(line1, 0, 25, 200, 25)

  9. w.itemconfig(rect1, fill = "red")

  10. w.delete(line2)

  11. tk.Button(root, text = "删除全部", command = (lambda x = "all": w.delete(x))).pack() "all"其实是一个 tag, 就是画布所有对象

  12. root.mainloop()

你还可以在 Canvas 上面显示文本,可以使用 create_text() 方法。

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. w = tk.Canvas(root, width = 200, height = 100, background = "white")

  4. w.pack()

  5. w.create_line(0, 0, 200, 100, fill = "green", width = 3)

  6. w.create_line(200, 0, 0, 100, fill = "green", width = 3)

  7. w.create_rectangle(40, 20, 160, 80, fill = "green")

  8. w.create_rectangle(65, 35, 135, 65, fill = "yellow")

  9. w.create_text(100, 50, text = "Python")

  10. root.mainloop()

我们可以看到,我们设置 text 的位置为 矩形中间,文本默认是居中显示的,你还可以通过设置 anchor 让它 靠边。

使用 Canvas 基本上是无所不能,无所不包的,你要画什么图形都可以,比如说,画一个圆形或者椭圆形(事实上圆形就是特殊的椭圆形),我们来举个例子:

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. w = tk.Canvas(root, width = 200, height = 100, background = "white")

  4. w.pack()

  5. w.create_rectangle(40, 20, 160, 80, dash = (4, 4))

  6. w.create_oval(40, 20, 160, 80, fill = "pink")

  7. w.create_text(100, 50, text = "Python")

  8. root.mainloop()

椭圆的限制范围的条件和矩形是一模一样的,然后得到的椭圆就是完美的贴合这个矩形,你就明白椭圆是怎么绘制的了。事实上,绘制椭圆是先给定一个限制矩形,然后就用椭圆来填充这个限定矩形。事实上,圆形就是特殊的椭圆,只需要把这个限定矩形改成正方形即可。

然后呢,你可能还想绘制一个多边形,你可以使用 create_polygon() 方法,现在就来带大家画一个五角星,首先,要画一个五角星,我们需要确定 5 个角的坐标,高中数学只要不是体育老师教的,都知道,都能够看得懂下面的原理图。

我们这里使用三角函数确定五角星5个角的位置,因为我们知道它的中心到各个点的距离是一样的。我们就可以得到各个点的坐标。将这5个点连起来就是一个五角星了。绘制一个多边形,我们使用 create_polygon() 方法,就是依次传入每个点的坐标(A-C-E-B-D)

代码如下:

 
  1. import tkinter as tk

  2. import math

  3. root = tk.Tk()

  4. w = tk.Canvas(root, width = 200, height = 100)

  5. w.pack()

  6. center_x = 100

  7. center_y = 50

  8. r = 50

  9. points = [

  10. #左上点(A)

  11. center_x - int(r * math.sin(2 * math.pi / 5)),

  12. center_y - int(r * math.cos(2 * math.pi / 5)),

  13. #右上点(C)

  14. center_x + int(r * math.sin(2 * math.pi / 5)),

  15. center_y - int(r * math.cos(2 * math.pi / 5)),

  16. #左下点(E)

  17. center_x - int(r * math.sin(math.pi / 5)),

  18. center_y + int(r * math.cos(math.pi / 5)),

  19. #顶点(B)

  20. center_x,

  21. center_y - r,

  22. #右下点(D)

  23. center_x + int(r * math.sin(math.pi / 5)),

  24. center_y + int(r * math.cos(math.pi / 5))

  25. ]

  26. w.create_polygon(points, outline = "green", fill = "yellow") #fill 默认是 black ,黑色填充

  27. root.mainloop()

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

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

相关文章

Linux下在终端输入密码隐藏方法

Linux系统中,如何将在终端输入密码时将密码隐藏? 最近做简单的登录界面时,不做任何操作的话,在终端输入密码的同时也会显示输入的密码是什么,这样对于隐蔽性和使用都有不好的体验。那么我就想到将密码用字符*隐藏起来…

Glow: Generative Flow with Invertible 1×1 Convolutions论文解析及实现(二)

Glow: Generative Flow with Invertible 11 Convolutions 代码github: https://github.com/rosinality/glow-pytorch添加链接描述 1 模型架构如下 1.1 左边图flow模型 Flow model ① ActNorm ② InvConv2dLU ③ AffineCoupling 1.2 右边模型结构Glow模型 Glow Model Block…

C++之poll与epoll总结(一百六十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

SpringCloudAlibaba之Ribbon

Ribbon是nacos自带的负载均衡器,属于客户端的负载均衡 但是在Spring高级版本中让LoadBalancer替代了 本人用的是2.1.0的nacos,ribbon还没有被替换。 使用: 在配置类中:LoadBalanced BeanLoadBalancedpublic RestTemplate restT…

ETHERNET/IP转RS485/RS232网关什么是EtherNet/IP?

网络数据传输遇到的协议不同、数据互通麻烦等问题,一直困扰着大家。然而,现在有一种神器——捷米JM-EIP-RS485/232,它将ETHERNET/IP网络和RS485/RS232总线连接在一起,让数据传输更加便捷高效。 那么,它是如何实现这一功…

Python Web开发技巧VIII

目录 ModelSerializer和Serializer区别是什么 从queryset中取出某个models的字段值 Q对象进行模糊匹配 HTTP方式-如何模糊搜索JSON字段中的某个KEY值呢? showmigrations 合并两个或多个queryset ModelSerializer和Serializer区别是什么 都是DRF中用于序列化和…

尚医通9:医院列表功能+GateWay网关

内容介绍 1、医院列表功能(接口) 4、医院列表功能(前端) 5、更新医院上线状态功能 6、医院详情 7、GateWay网关 8、医院排班管理需求分析 9、查看医院所有科室接口、前端 医院列表功能(接口) 接口…

代码随想录算法训练营day15 | 102. 二叉树的层序遍历,226. 翻转二叉树,101. 对称二叉树

目录 102. 二叉树的层序遍历 226. 翻转二叉树 101. 对称二叉树 100. 相同的树 100是101的衍生题目。572也为101的衍生题目。 102. 二叉树的层序遍历 思路&#xff1a; 以前的笔记 代码&#xff1a; class Solution {public List<List<Integer>> levelOrder(T…

web自动化测试-PageObject 设计模式

为 UI 页面写测试用例时&#xff08;比如 web 页面&#xff0c;移动端页面&#xff09;&#xff0c;测试用例会存在大量元素和操作细节。当 UI 变化时&#xff0c;测试用例也要跟着变化&#xff0c; PageObject 很好的解决了这个问题。 使用 UI 自动化测试工具时&#xff08;包…

Reinforcement Learning with Code 【Chapter 9. Policy Gradient Methods】

Reinforcement Learning with Code This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation of Reinforcement Learning, . 文章…

C++之实例化对象总结(一百七十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

13 亿美金买个寂寞?No!AI 时代的数据行业蓄势待发

6月底&#xff0c;全球数据分析领域彻底炸锅了。 两大数据分析企业Databricks和Snowflake纷纷将目光瞄准了AI大模型。要知道&#xff0c;这两位对手平时没少对台戏&#xff0c;为性能、产品和技术经常开撕。但在今年的自家大会上&#xff0c;两家企业却出奇的一致&#xff0c;…

opencv+ffmpeg环境(ubuntu)搭建全面详解

一.先讲讲opencv和ffmpeg之间的关系 1.1它们之间的联系 我们知道opencv主要是用来做图像处理的&#xff0c;但也包含视频解码的功能&#xff0c;而在视频解码部分的功能opencv是使用了ffmpeg。所以它们都是可以处理图像和视频的编解码&#xff0c;我个人感觉两个的侧重点不一…

【博客684】Multi-regional高可用模式部署VictoriaMetrics

Multi-regional模式部署VictoriaMetrics 整体架构图 每个工作负载区域&#xff08;地球、火星、金星&#xff09;都有一个 vmagent&#xff0c;通过监控设置将数据发送到多个区域。监控设置&#xff08;地面控制 1,2&#xff09;包含 VictoriaMetrics 时间序列数据库 (TSDB) 集…

四姑娘山三日游

趁着小孩放暑假&#xff0c;从昆明回来之后&#xff0c;直接自驾到四姑娘山。 第一天 成都-四川省阿坝藏族羌族自治州小金县日隆镇(20230711) 大概9:30从成都市郫都区出发&#xff0c;路线如下&#xff1a;郫都—都江堰–映秀—耿达—卧龙—四姑娘山&#xff0c;中途翻过巴朗…

Notepad++工具通过正则表达式批量替换内容

1.每行末尾新增特定字符串 CtrlH弹出小窗口&#xff1b;查找目标输入$&#xff0c;替换为输入特定字符串&#xff1b;选中循环查找&#xff0c;查找模式选正则表达式&#xff1b;最后点击全部替换 2.每行行首新增特定字符串 CtrlH弹出小窗口&#xff1b;查找目标输入^&…

会议OA之我的会议(会议排座送审)

目录 前言&#xff1a; 2.我的会议&#xff1a; 2.1实现的特色功能&#xff1a; 2.2思路&#xff1a; 2.3功能实现&#xff1a; 我的会议页面&#xff1a;myMeeting.jsp myMeeting.js Dao方法 在mvc中配置info信息 Meeting InfoAction 2.4会议排座的思路&#xff1a; …

第四代SHARC® ADSP-21479KBCZ-2A、ADSP-21479BSWZ-2A、ADSP-21479KSWZ-2A高性能DSP(数字信号处理器)

第四代SHARC Processors 现在内置低功耗浮点DSP产品&#xff08;ADSP-21478和ADSP-21479&#xff09;&#xff0c;可提供改进的性能、基于硬件的滤波器加速器、面向音频与应用的外设以及能够支持单芯片解决方案的新型存储器配置。所有器件都彼此引脚兼容&#xff0c;而且与以往…

【Android知识笔记】UI体系(二)

什么是UI线程? 常说的UI线程到底是哪个线程?UI线程一定是主线程吗? 下面先给出两条确定的结论: UI线程就是刷新UI所在的线程UI是单线程刷新的关于第二条为什么UI只能是单线程刷新的呢?道理很简单,因为多线程访问的话需要加锁,太卡,所以一般系统的UI框架都是采用单线程…

《重构的时机和方法》,值得程序员仔细研读的一本书

现有代码结构及框架沿用的比较久&#xff0c;持续在其上新增功能&#xff0c;可维护性与可扩展性变得越来越差&#xff0c;随着需求不断增加&#xff0c;现有代码变得越来越臃肿复杂&#xff0c;变得很难维护&#xff0c;甚至出现较严重的性能瓶颈&#xff0c;一般这个时候我们…