问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

PythonTkinter组件之Canvas

发布网友 发布时间:2024-09-15 03:23

我来回答

1个回答

热心网友 时间:2024-09-21 02:40

前言

大家小时候都玩过涂鸦吧,不管在哪里,只有有画纸和彩笔,画布上就能出现想象力丰富的图案。

上学时,我们面对难题,大家都喜欢在画纸上把自己的思路画出来

如今,工作中不管是个人还是团队,在画图软件画思维导图、项目框等等,图形化更加直观

画图工具在我们日常生活中随处可见,我们最常见的有Windows系统-画图,MAC系统的备忘录,那么我们来看一下,画图工具的构造吧

标题、每一栏描述语及形状等都是Label标签组件

空白面积最大的是Canvas画布组件

查看->显示状态是CheckbuttonF复选框组件

最后我们要退出或者小化放大窗口按钮是Button组件

我们可以看到,在画图工具中主要的作用就是在那空白的位置添加图片、画图等

本期,我们开始学习PythonTkinter标准组件Canvas画布相关属性和方法,Let'sgo~

1.Canvas概述

Canvas(画布)是PythonTkinter标准组件,可放置图形、图相、组件等功能

Canvas特点

Canvas画布是一个矩形区域用来绘制

Canvas画布可以添加线性、圆形、图片

Canvas画布支持添加的组件位置、外观

Canvas画布也提供Button、Label其他组件

Canvas语法格式

Ca=Canvas(mater,options)2.Canvas相关属性属性含义anchor指定绘制文字、GUI组件的位置。该选项仅对create_text()、create_window()方法有效joinstyle指定直接连接点的风格。仅对绘制直线和多向形有效。该选项支持METTER、ROUND、BEVEL选项值。justify指定文字的对齐方式。该选项支持CENTER、LEFT、RIGHT常量值,该选项仅对create_text方法有效。arrowshape指定箭头形状。该选项是一个形如"202010"的字符串,字符串中的三个整数依次指定填充长度、箭头长度、箭头宽度。arrow指定绘制直线时两端是否有箭头。该选项支持NONE(两端无箭头)、FIRST(开始端有箭头)、LAST(结束端有箭头)、BOTH(两端都有箭头)选项值。extent指定绘制弧的角度。该选项仅对create_arc方法起作用。start指定绘制弧的起始角度。该选项仅对create_arc方法起作用。style指定绘制弧的样式。该选项仅对create_arc方法起作用。该选项支持PIESLICE(扇形)、CHORD(弓形)、ARC(仅绘制弧)选项值。stipple使用位图平铺进行填充。该选项可与fill选项结合使用,fill选项用于指定位图的颜色。dash指定边框使用虚线。该属性值既可为单独的整数,用于指定虚线中线段的长度;也可为形如(5,2,3)格式的元素,此时5指定虚线中线段的长度,2指定间隔长度,3指定虚线长度……依此类推。width指定边框宽度。如果不指定该选项,边框宽度默认为1outline指定边框颜色。fill指定填充颜色。如果不指定该选项,默认不填充。3.Canvas常用方法

Canvas画布提供绘制图形方法

方法作用create_rectangle()绘制矩形create_oval()绘制椭圆(包括圆,圆是椭圆的特例)create_arc绘制弧create_bitmap绘制位图create_image绘制图片create_line()绘制直线create_polygon绘制多边形create_text绘制文字create_window绘制组件

Canvas画布提供操作图形标签方法

方法作用addtag_aboove()为tagOrId对应图形项的上一个图形项添加新tagaddtag_all()为所有图形项添加新tagaddtag_below()为tagOrId对应图形项的下一个图形项添加新tagaddtag_closest()为和x、y点最接近的图形项添加新tagaddtag_enclosed()为指定矩形区域内最上面的图形项添加新tagdtag()删除指定图形项的taggettags()获取指定图形的所有Tagfind_withtag()获取tagOrId对应的所有图形项find_above()返回tagOrId对应图形项的上一个图形项find_all()返回全部图形项find_below()返回tagOrId对应图形项的下一个图形项find_closest()返回和x、y点最接近的图形项find_enclosed()返回位于指定矩形区域内最上面的图形项find_overlapping()返回与指定矩形区域重叠的最上面的图形项find_withtag()返回tagOrId对应的全部图形项

Canvas画布提供操作图形方法

方法作用coords()重设图形项的大小和位置itemconfig()为tagOrId对应图形项配置选项move()移动画布上组件delete()删除画布上组件scale()缩放图形项dchars()删除文字图形项中间的部分文字

?重要说明:

Canvas元素坐标是绘图的基础

点(0,0)位于Canvas组件的左上角

X轴水平向右延伸

Y轴垂直向下延伸

4.小试牛刀

Canvas组件实操练习效果如下:

创建Canvas组件

self.Ca=Canvas(self,width=450,height=500)self.Ca.pack()

Canvas组件提供create_polygon创建多边形图形

坐标(x1,y1,x2,y2,x3,y3)可以使用random.randint()来生成

可以多边绘制三角形

defdraw_pol(self):self.Ca.create_polygon((1*x1,y1*10,x2*1,y2*18,x3*10,y3*18),fill=rcolor)

Canvas组件提供create_line()来绘制直线

坐标(x1,y1,x2,y2)可以使用random.randint()来生成

defdraw_line(self):self.Ca.create_line(x1,y1,x2,y2,fill=rcolor)

Canvas组件提供create_oval()来绘制椭圆形

坐标(x1,y1,x2,y2)可以使用random.randint()来生成

椭圆坐标之间是有一定关系的

defdraw_oval(self):self.Ca.create_oval(x1,y1/2,x2*4,y2*4,fill=rcolor)

Canvas组件提供create_rectangle()来绘制矩形

坐标(x1,y1,x2,y2)可以使用random.randint()来生成

可以使用属性来设置矩形的外观,比如dash属性矩形线条是虚线

defdraw_rect(self):self.Ca.create_rectangle(x1,y1,x2,y2,fill=rcolor,dash=(4,4))

Canvas组件提供create_image()来添加图片

坐标(x1,y1)可以使用random.randint()来生成

要设置全局边Photo否则图片无法显示

defdraw_image(self):x1=random.randint(1,100)y1=random.randint(1,100)globalPhotoPhoto=PhotoImage(file="heart.gif")self.Ca.create_image(x1,y1,image=Photo)

Canvas组件可以支持绑定鼠标事件,使用鼠标进行绘制任意图形

self.Ca.bind("<B1-Motion>",self.paint)

以上图形绘制的颜色是随机产生的

defrandomcolor(self):colorlist=["1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"]color=""foriinrange(6):color+=colorlist[random.randint(0,14)]return'#'+color

颜色代码是以“#”开头的6位16进制代码

使用for循环进行random.randint()来随机产生每一位的代码

完整代码如下:

fromtkinterimport*importrandomimporttkinterclassApplication(Frame):def__init__(self,master=None):#super()代表的是父类的定义,而不是父类对象super().__init__(master)self.master=masterself.pack()self.createWidgetCanvas()defcreateWidgetCanvas(self):self.Ca=Canvas(self,width=450,height=500)self.Ca.pack()self.Ca.bind("<B1-Motion>",self.paint)Button(self,text="清空画布",width=10,command=(lambdax="all":self.Ca.delete(x))).pack(side="left")Button(self,text="画三角形",width=10,command=self.draw_pol).pack(side="left")Button(self,text="画椭圆",width=10,command=self.draw_oval).pack(side="left")Button(self,text="画直线",width=10,command=self.draw_line).pack(side="left")Button(self,text="画矩形",width=10,command=self.draw_rect).pack(side="left")Button(self,text="添加图片",width=10,command=self.draw_image).pack(side="left")defdraw_line(self):x1=random.randint(0,500)y1=random.randint(0,500)x2=random.randint(0,500)y2=random.randint(0,500)rcolor=self.randomcolor()self.Ca.create_line(x1,y1,x2,y2,fill=rcolor)defdraw_oval(self):x1=random.randint(0,100)y1=random.randint(0,100)x2=random.randint(0,100)y2=random.randint(0,100)rcolor=self.randomcolor()self.Ca.create_oval(x1,y1/2,x2*4,y2*4,fill=rcolor)defdraw_rect(self):x1=random.randint(5,500)y1=random.randint(5,500)x2=random.randint(5,500)y2=random.randint(5,500)rcolor=self.randomcolor()self.Ca.create_rectangle(x1,y1,x2,y2,fill=rcolor,dash=(4,4))defdraw_pol(self):x1=random.randint(1,100)y1=random.randint(1,40)x2=random.randint(1,100)y2=random.randint(1,30)x3=random.randint(1,40)y3=random.randint(1,30)rcolor=self.randomcolor()self.Ca.create_polygon((1*x1,y1*10,x2*1,y2*18,x3*10,y3*18),fill=rcolor)defdraw_image(self):x1=random.randint(1,100)y1=random.randint(1,100)globalPhotoPhoto=PhotoImage(file="heart.gif")self.Ca.create_image(x1,y1,image=Photo)defpaint(self,event):x1,y1=(event.x-1),(event.y-1)x2,y2=(event.x+1),(event.y+1)self.Ca.create_oval(x1,y1,x2,y2,fill="pink")defrandomcolor(self):colorlist=["1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"]color=""foriinrange(6):color+=colorlist[random.randint(0,14)]return'#'+colorroot=Tk()root.geometry("300x130+200+300")root.title("MyfirstAPP")app=Application(master=root)root.mainloop()总结

本期,我们学习PythonTkinter提供一个非常强大好玩的Canvas组件。我们使用Canvas组件可以精美的图形,增加我们程序的趣味性。

以上是本期内容,欢迎大佬们点赞评论指正,下次见~?(????`)比心??

作者:盆友圈的小可爱
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我老公独自开车和别车相撞,老公的车当时翻了车,人无大碍车很惨。被撞... 老公是否出轨了? Word中设置图文框位置有妙招 员工两个月没上班怎么解除劳动合同 舌苔发黄并且有口臭怎么回事 舌苔发黄 口干舌燥 舌苔发黄 口干是什么原因 网络营销怎样做?教你4步做好免费推广 在八廓街旅行有哪些当地特产值得推荐? 拉萨的哪些特产美食是游客极力安利的? 和平精英小号怎么建 半程和全程马拉松马各是多少公里?世界记录是多少? 有什么制作鸡蛋糕的小窍门? 美国“里根”号航母返回日本横须贺母港,是结束部署还是临时靠港修整... 小叔的孩子明天即将出生,请百度上的朋友们帮我推荐个好名字。 陆游书愤原文注释翻译与赏析 请给将于明天出生的女孩起个响亮好听的名字 名字叫明天的怎么样? 葫芦丝演奏有什么需要注意的问题吗?除了技巧之外,肢体动作需要注意哪 ... 你喜欢看美剧吗?你会花钱付费看美剧吗? 越狱第一季俄版越狱第一季百度云 ...越狱》种子!1-5季都要,最好人人影视的,高清720P以上,双语挂字幕的... 跪求《和宿敌结婚当天一起重生了》txt百度云!!!收费的别来! 越狱 电视剧一到四季百度云资源 曹操为什么没有报复害死爱子、侄儿及爱将的贾诩? 毒士贾诩出主意到底有多损?曹操差点被其所害 张绣在被贾诩劝降曹操之后,他受到了怎样的待遇? DNF冒险团怎么改名字(DNF冒险团改名步骤详解)「科普」 dnf冒险团改名卡怎么领取-冒险团改名卡获得方法 三丽牌璇姆茶反弹原因 python里面有多少类(2023年最新解答) 关于python多少字节释放锁的信息 广州市总共有多少所小学,多少小学生 出道五年的李一桐资源好到爆,部部都是大女主,为何依旧不温不火?_百... 请问什么是走婚 劳斯莱斯的冷知识,你知道多少 黑龙江比较好的全日制大专单招学校推荐 《大海的咏叹》 谱子可以发我么 谢啦! emma0807@yahoo.cn 加热棒开26度和28度功率一样吗 如何粉碎文件夹并且防止恢复文件? ...才、三点水、竖心旁、言字旁、口)都能组成一个新字 一个谜语,我想了三天还是想不出啊‘~ 穿白色衣服最防晒吗 机制炭机制炭市场前景 临床医学考研中的专业基础课是指什么啊? imsi码是什么意思? 微信聊天记录怎么同步在两个手机中? 怎样把微信的聊天记录迁移到另一个手机上? 高丽参属于什么植物类型? 请问有肝病的人是否可以经常喝蜂蜜