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

news2024/11/13 14:47:00

这节课我们接着来讲解 Canvas 组件,既然 Cnavas 是画布的意思,那我们能不能让这个组件来设计一个画板呢?像Windows 自带的画图程序,我们的用户可以在上面随心所欲的绘制自己想要的图画,大家仔细想想,其实画图程序的实现原理很简单,就是通过获取用户拖拽鼠标时候的每一个位置(每个坐标),然后每个坐标对应绘制上一个点就可以了。这就提供了用户进行自由的绘制,但是有一点,tkinter 并没有提供支持画点的方法,但是呢,我们可以通过绘制一个超小的圆来表示一个点。

我们来实现一下:

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. w = tk.Canvas(width = 400, height = 200)

  4. w.pack()

  5. def paint(event):

  6. x1, y1 = (event.x -1), (event.y -1)

  7. x2, y2 = (event.x +1), (event.y +1)

  8. w.create_oval(x1,y1,x2,y2, fill = "red")

  9. w.bind("<B1-Motion>", paint)

  10. tk.Label(root, text = "按住鼠标左键并拖拽,绘制你的理想蓝图吧......").pack(side = "bottom")

  11. root.mainloop()

关于 Cnavas,有些概念我认为你们需要理解,(温馨提示一下,如果对各个组件还有什么不懂的,可以直接看我整理的各组件的详解。)

Carvas 组件支持一些对象:

  • arc(弧形、弦或扇形)
  • bitmap(内建的位图文件或 XBM 格式的文件)
  • image(BitmapImage 或 PhotoImage 的实例对象)
  • line(线)
  • oval(圆或椭圆形)
  • polygon(多边形)
  • rectangle(矩形)
  • text(文本)
  • window(组件)

其中,弦、扇形、椭圆形、圆形、多边形和矩形这些“封闭式”图形都是由轮廓线(outline)和填充(fill)颜色组成的,但都可以设置为透明(传入空字符串表示透明)。

Canvas 组件可以选择使用两种坐标系:

  • 窗口坐标系:以窗口的左上角作为坐标原点
  • 画布坐标系:以画布的左上角作为坐标原点

将窗口坐标系转换为画布坐标系,可以使用 canvasx() 或 canvasy() 方法。

画布对象显示的顺序

Canvas 组件中创建的画布对象都会被列入显示列表中,越接近背景的画布对象位于显示列表的越下方。显示列表决定当两个画布对象重叠的时候是如何覆盖的(默认情况下新创建的会覆盖旧的画布对象的重叠部分,即位于显示列表上方的画布对象将覆盖下方那个)。当然,显示列表中的画布对象可以被重新排序。

指定画布对象

Canvas 组件提供几种方法让你指定画布对象:

  • Item handles
  • Tags
  • "all"
  • "current"

ndles 事实上是一个用于指定某个画布对象的整型数字(也成为画布对象的 ID)。当你在 Canvas 组件上创建一个画布对象的时候,Tkinter 将自动为其指定一个在该 Canvas 组件中独一无二的整型值。然后各种 Canvas 的方法可以通过这个值操纵该画布对象。

Tags 是附在画布对象上的标签,Tags 由普通的非空白字符串组成。一个画布对象可以与多个 Tags 相关联,一个 Tag 也可用于描述多个画布对象。然而,与 Text 组件不同,没有指定画布对象的 Tags 不能进行事件绑定和配置样式。也就是说,Canvas 组件的 Tags 是仅为画布对象所拥有。

Canvas 组件预定义了两个 Tags:"all" 和 "current"

 "all" 表示 Canvas 组件中的所有画布对象

 "current" 表示鼠标指针下的画布对象(如果有的话)

画一个 哆啦A梦:(相信大家只要有耐心,好好计算坐标点,都能够画出来的)

 
  1. import tkinter as tk

  2. root = tk.Tk()

  3. #画板

  4. w = tk.Canvas(root, width=600, height=600, background="white")

  5. w.pack()

  6. #使用RGB颜色设计浅蓝色

  7. Light_blue ="#%02x%02x%02x" % (0, 159, 232)

  8. #头的轮廓蓝色

  9. w.create_oval(150, 100,450,400,outline="black",fill=Light_blue)

  10. #脸的白色

  11. w.create_oval(175, 150,425,400,outline="black",fill="white")

  12. #眼睛,椭圆,白色,先左后右

  13. w.create_oval(250,115,300,180,outline="black",fill="white")

  14. w.create_oval(300,115,350,180,outline="black",fill="white")

  15. #眼睛 ==》》黑色,椭圆,先左后右

  16. w.create_oval(280,137,295,159,outline="black",fill="black")

  17. w.create_oval(305,137,320,159,outline="black",fill="black")

  18. #眼睛==》》白色,椭圆,先左后右

  19. w.create_line(287.5,145,287.5,151,fill='white',width=3,capstyle='round')

  20. w.create_line(312.5,145,312.5,151,fill='white',width=3,capstyle='round')

  21. #脸上的竖线黑色

  22. w.create_line(300,180,300,300,fill='black',width=1)

  23. #胡须水平的部分黑色,先左后右

  24. w.create_line(200,240,280,240,fill='black',width=1.5)

  25. w.create_line(320,240,400,240,fill='black',width=1.5)

  26. #胡须位于水平胡须下方的两根黑色,先左后右

  27. w.create_line(210,280,280,260,fill='black',width=1.5)

  28. w.create_line(320,260,390,280,fill='black',width=1.5)

  29. #胡须位于水平胡须上方的两根黑色,先左后右,

  30. w.create_line(210,200,280,220,fill='black',width=1.5)

  31. w.create_line(320,220,390,200,fill='black',width=1.5)

  32. #嘴巴部分黑色

  33. w.create_arc(175,50,425,300,width=1,style="arc",start=240,extent=60)

  34. #鼻子红色

  35. w.create_oval(290, 170,310,190,outline="black",fill="red")

  36. #胳膊,蓝色,从左至右

  37. w.create_arc(-75, 325,265,665,width=1,start=35,extent=20,style="pieslice",outline='black',fill=Light_blue)

  38. w.create_arc(335, 325,675,665,width=1,start=125,extent=20,style="pieslice",outline='black',fill=Light_blue)

  39. #胳膊去圆心部分,白色,从左至右

  40. w.create_arc(50, 450,140,540,width=1,start=35,extent=20,style="pieslice",outline='white',fill='white')

  41. w.create_arc(460, 450,550,540,width=1,start=125,extent=20,style="pieslice",outline='white',fill='white')

  42. #手,白色,从左至右

  43. w.create_oval(120, 430,160,470,outline="black",fill="white")

  44. w.create_oval(440, 430,480,470,outline="black",fill="white")

  45. #身体蓝色部分

  46. w.create_rectangle(188,350,412,550,fill=Light_blue,outline="black")

  47. #腹部的圆,白色

  48. w.create_oval(215, 340,385,510,outline="white",fill="white")

  49. #脖子上的横线红色部分

  50. w.create_line(188,350,412,350,fill='red',width=15,capstyle='round')

  51. #腹部的半圆,白色

  52. w.create_arc(240, 365,360,485,width=1,start=180,extent=180,style="pieslice",outline='black',fill='white')

  53. #两脚中间的扇形 白色

  54. w.create_arc(280, 530,320,570,width=1,start=0,extent=180,style="pieslice",outline='white',fill='white')

  55. #两只脚,椭圆,白色

  56. w.create_oval(170, 530,290,570,outline="black",fill="white")

  57. w.create_oval(310, 530,430,570,outline="black",fill="white")

  58. #铃铛部分,黄色

  59. w.create_oval(286, 346,314,374,outline="black",fill="yellow")

  60. #铃铛的横线,黄色,使用矩形

  61. w.create_rectangle(286,357,314,361,fill="yellow",outline="black")

  62. #铃铛上的小红圆

  63. w.create_oval(297, 363,303,369,outline="black",fill="red")

  64. #脸上的竖线黑色

  65. w.create_line(300,369,300,374,fill='black',width=1)

  66. root.mainloop()

在这里我学会的一点就是:

如何在 tkinter 中使用自定义的 RGB 颜色:

语法如下:

define_color ="#%02x%02x%02x" % (0, 159, 232)  

上面这一行代码的意思就是 创建一个名为 define_color 的变量,存取RGB 分别为 0,159,232 的颜色。

在后面就是直接使用 define_color,如:background = define_color,不需要加引号了。

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

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

相关文章

美团小图币代挂教程

登陆美团官网获取对应的cookie 美团官网&#xff0c;点击右上角登陆对应账号。登陆成功后使用f12来获取 cookie 此时如果没有任何数据&#xff0c;点击网页刷新。找到如下的网络请求 赋值cookie项的全部内容&#xff0c;此时已经获取到对应账号的cookie 使用cookie登陆代挂…

NODEJS笔记

全局对象 global/window console.log/info/warn/error/time/timeEnd process.arch/platform/version/env/kill/pid/nextTick Buffer.alloc(5,abcde) String/toString setTimeout/clearTimeout setInterval/clearInterval setImmediate/clearImmediate process.nextTi…

1.netty介绍

1.介绍 是JBOSS通过的java开源框架是异步的,基于事件驱动(点击一个按钮调用某个函数)的网络应用框架,高性能高可靠的网络IO程序基于TCP,面向客户端高并发应用/点对点大量数据持续传输的应用是NIO框架 (IO的一层层封装) TCP/IP->javaIO和网络编程–>NIO—>Netty 2.应用…

HTTP请求走私漏洞简单分析

文章目录 HTTP请求走私漏洞的产生HTTP请求走私漏洞的分类HTTP请求走私攻击的危害确认HTTP请求走私漏洞通过时间延迟技术确认CL漏洞通过时间延迟技术寻找TE.CL漏洞 使用差异响应内容确认漏洞通过差异响应确认CL.TE漏洞通过差异响应确认TE.CL漏洞 请求走私漏洞的利用通过请求漏洞…

【面试题】与通义千问的芯片前端设计模拟面试归纳

这里是尼德兰的喵芯片设计相关文章,欢迎您的访问! 如果文章对您有所帮助,期待您的点赞收藏! 让我们一起为芯片前端全栈工程师而努力! 前言 两个小时,与chatGPT进行了一场数字IC前端设计岗的面试_尼德兰的喵的博客-CSDN博客 和GPT-3.5的回答可以对比品尝,味道更好。 模…

nacos源码打包及相关配置

nacos 本地下载后&#xff0c;需要 install 下&#xff1a; mvn clean install -Dmaven.test.skiptrue -Dcheckstyle.skiptrue -Dpmd.skiptrue -Drat.skiptruenacos源码修改后&#xff0c;重新打包生成压缩包命令&#xff1a;在 distribution 目录中运行&#xff1a; mvn -Pr…

数字化转型导师坚鹏:数字化时代扩大内需的8大具体建议

在日新月异的数字化时代、复杂多变的国际化环境下&#xff0c;扩大内需成为推动经济发展的国家战略&#xff0c;如何真正地扩大内需&#xff1f;结合本人15年的管理咨询经验及目前实际情况的深入研究&#xff0c;提出以下8大具体建议&#xff1a; 1、制定国民收入倍增计划。结…

QObject::connect: No such signal me::sendMsg(QString s) in ...

QObject::connect: No such signal me::sendMsg&#xff08;QString s&#xff09; in ... 解决方案 在使用qt4的connect中&#xff0c;爆的bug&#xff1a; 导致 teacher 的槽函数 receiveMsg(QString s) 一直没有被调用。。。。 解决方案 去掉参数名&#xff0c; 保留类型…

spring6——容器

文章目录 容器&#xff1a;IocIoc容器控制反转&#xff08;Ioc&#xff09;依赖注入IoC容器在Spring的实现 基于XML管理Bean搭建环境获取bean依赖注入setter注入构造器注入特殊值处理字面量赋值null值xml实体CDATA节 特殊类型属性注入为对象类型属性赋值方式一&#xff1a;引入…

Spring依赖注入和ioc在spring中的实现方式

目录 一、依赖注入 1.IOC思想 2.什么是依赖注入&#xff1f; 3.实例化对象中有pojo类型属性 二、IOC在Spring中的实现方式 1.获取bean的三种方式 1.1根据bean的id获取 1.2根据bean的类型获取&#xff08;最常用&#xff0c;因为在IOC容器中&#xff0c;一个类型的bean只…

APUE学习62章终端(一): 整体概览

1. 什么是终端 <Linux_UNIX系统编程手册下>的第62.1介绍了整体概览&#xff0c;但是说得比较模糊&#xff0c;什么是终端这个问题请参考下面的博客: https://www.cnblogs.com/changrunwei/p/15759664.html 它讲解了以下概念: 终端(UNIX和Linux把人和机器可以交互的接…

剑指offer47.礼物的最大价值

这道题挺简单&#xff0c;学过动态规划就会。如果要走到grid[i][j],那你的上一步必须是grid[i-1][j]或者grid[i][j-1],具体是grid[i-1][j]还是grid[i][j-1]&#xff0c;就看哪一步的价值最大&#xff0c;所以用一个与grid等大的dp数组来表示走到grid[i][j]的最大价值是dp[i][j]…

阿里用户序列建模MIMN

Practice on Long Sequential User Behavior Modeling for Click-Through Rate Prediction 摘要 对于序列建模&#xff0c;实践了机器学习算法与在线服务协同设计的CTR预测系统&#xff0c;理论上可以处理无限长的用户序列。 从服务系统的角度来看&#xff0c;通过设计一个单…

MIT 6.830数据库系统 -- lab five

MIT 6.830数据库系统 -- lab five 项目拉取引言搜索练习1 BTreeFile.findLeafPage() 插入练习2 Spliting Page 删除练习3 页再分配练习4 合并页 事务 项目拉取 原项目使用ant进行项目构建&#xff0c;我已经更改为Maven构建&#xff0c;大家直接拉取我改好后的项目即可: http…

选择器jQuery

诚信是你价格不菲的鞋子&#xff0c;踏遍千山万水&#xff0c;质量也应永恒不变。 jQuery选择器大全总结&#xff1a; jQuery选择器是一种用于在HTML文档中选择元素的强大工具。下面是一些常用的jQuery选择器的总结&#xff1a; 基本选择器&#xff1a; 元素选择器&#xff1a…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(14)-Fiddler断点(breakpoints)实战,篡改或伪造数据

1.简介 上一篇主要就讲解和分享Fiddler断点的理论和操作&#xff0c;今天宏哥就用具体例子&#xff0c;将上一篇中的理论知识实践一下。而且在实际测试过程中&#xff0c;有时候需要修改请求或响应数据&#xff0c;或者直接模拟服务器响应&#xff0c;此时可以使用fiddler进行…

测试|测试用例设计常见面试题

测试|测试用例设计常见面试题 文章目录 测试|测试用例设计常见面试题1.怎么模拟弱网&#xff08;测试技巧&#xff09;2.怎么测试接口&#xff08;测试技巧&#xff09;3.怎么对冒泡排序测试&#xff08;代码类&#xff09;4.怎么对linux的zip命令进行测试&#xff08;软件类&a…

Linux: 设置qmake的Qt版本

Qt开发&#xff0c;qmake会对应一个Qt版本&#xff0c;有时候需要切换这个版本&#xff0c;例如把qmake从Qt5.12切换到Qt5.9, 怎么操作呢&#xff1f; 案例如下&#xff1a; 银河麒麟V10系统&#xff0c;下载安装了Qt5.9.8&#xff0c;但是检查qmake发现它使用的是5.12.8&…

《JeecgBoot系列》JeecgBoot(ant-design-vue)实现表单页面缓存(keep-alive)

JeecgBoot(ant-design-vue)实现表单页面缓存(keep-alive) 一、keep-alive介绍 keep-alive是vue的一个内置实例&#xff0c;通过这个属性可以缓存组件的v-node&#xff0c;可以实现页面缓存的功能。 keep-alive有三个属性&#xff1a; 1.include&#xff1a;记录了哪些组件可…

【Spring】聊聊Spring如何解决的循环依赖以及三级缓存

循环依赖是什么 在平时的面试中&#xff0c;只要问到Spring&#xff0c;那么大概率肯定会问什么是循环依赖&#xff0c;Sping是如何解决循环依赖的。以及三级缓存机制是什么。所以为了从根本上解决这个问题&#xff0c;本篇主要详细介绍一下循环依赖的问题。 Spring Bean初始…