GUI的最终选择 Tkinter(六):Canvas组件
Canvas组件,是一个可以让你任性的组件,一个可以让你随心所欲地绘制界面的组件。Canvas是一个通用的组件,它通常用于显示和编辑图形,可以用它来绘制直线,圆形,多边形,甚至是绘制其他组件。
在Canvas组件上绘制对象,可以用creat_xxx()方法(xxxvia表示对象类型,例如直线line,矩形rectangle和文本text等)。
from tkinter import * root = Tk()
w = Canvas(root,width=,height=)
w.pack()
w.create_line(,,,,fill="yellow")
w.create_line(,,,,fill="red",dash=(,))
w.create_rectangle(,,,,fill="blue")
mainloop()
执行结果:

注意,添加到画布上的对象会一直保留着。如果希望修改他们,可以使用coords(),itemconfig()和move()方法来医用画布上的对象,或者用delete()方法来删除。
from tkinter import * root = Tk()
w = Canvas(root,width=,height=)
w.pack()
line1 = w.create_line(,,,,fill="yellow")
line2 =w.create_line(,,,,fill="red",dash=(,))
rect = w.create_rectangle(,,,,fill="blue")
w.coords(line1,,,,)
w.itemconfig(rect,fill="red")
w.delete(line2)
Button(root,text="delete all",command=(lambda x=ALL:w.delete(x))).pack()
mainloop()
执行结果:

还可以在Canvas上显示文本,使用create_text()方法:
from tkinter import * root = Tk()
w = Canvas(root,width=,height=)
w.pack()
line1 = w.create_line(,,,,fill="yellow",width=)
line2 = w.create_line(,,,,fill="yellow",width=)
rect1 = w.create_rectangle(,,,,fill="yellow")
rect2 = w.create_rectangle(,,,,fill="blue")
text = w.create_text(,,text="python3")
Button(root,text="delete all",command=(lambda x=ALL:w.delete(x))).pack()
mainloop()
执行结果:

使用create_oval()方法绘制椭圆形(或圆形),参数是指定一个限定矩形(Tkinter会自动在这个矩形中绘制一个椭圆)
from tkinter import * root = Tk()
w = Canvas(root,width=,height=)
w.pack()
w.create_rectangle(,,,,dash=(,))
w.create_oval(,,,,fill="pink")
w.create_text(,,text="python")
mainloop()
执行结果:

而绘制圆形就是把限定矩形设置为正方形即可。
from tkinter import * root = Tk()
w = Canvas(root,width=,height=)
w.pack()
w.create_rectangle(,,,,dash=(,))
w.create_oval(,,,,fill="pink")
w.create_text(,,text="python")
mainloop()
执行结果:

如果想绘制多边形,可以使用create_polygon()方法。来看画一个五角星,因为五角星不是三角函数,所以需要计算位图,确定角度和
from tkinter import *
import math as m root = Tk()
w = Canvas(root,width=,height=,background="red")
w.pack()
center_x =
center_y =
r =
points = [
#左上点
center_x - int(r*m.sin(*m.pi/)),
center_y - int(r*m.cos(*m.pi/)),
#右下点
center_x + int(r*m.sin(*m.pi/)),
center_y - int(r*m.cos(*m.pi/)),
#左上点
center_x - int(r*m.sin(m.pi/)),
center_y + int(r*m.cos(m.pi/)),
#顶点
center_x,
center_y-r,
#右下点
center_x + int(r*m.sin(m.pi/)),
center_y + int(r*m.cos(m.pi/))
]
w.create_polygon(points,outline="green",fill="yellow")
mainloop()
执行结果:

下面来看一个,像windows画图工具那样的画板,可以随心所欲的画
先上代码
from tkinter import *
import math as m root = Tk()
w = Canvas(root,width=,height=)
w.pack()
def paint(event):
x1,y1 = (event.x-),(event.y-)
x2,y2 = (event.x+),(event.y+)
w.create_oval(x1,y1,x2,y2,fill="red")
w.bind("<B1 - Motion>",paint)
Label(root,text="按住鼠标拖动").pack(side=BOTTOM)
mainloop()
执行结果:

来分析下,其实这个的实现原理很简单,就是获取用户拖动鼠标的坐标,然后每个坐标对应绘制一个点上去就可以了,但是Tkinter没提供点的方法
所以我们就可以通过绘制一个超小的椭圆或者圆形来表示“点”,通过响应”鼠标拖动”事件,在鼠标拖动的同时,获取鼠标的实时位置,并绘制超小的圆形。
除了以上关于画布的知识点外,还有一些知识点,做个汇总:
1、Canvas组件支持的对象
-arc(弧形、炫或扇形)
-bitmap(内建的位图文件或XBM格式的文件)
-image(BitmapImage或PhotoImage的实例对象)
-line(线)
-oval(圆形或椭圆形)
-polygon(多边形)
-rectangle(矩形)
-text(文本)
-window(组件)
2、坐标系
由于画布可能比窗口大(带有滚动条的Canvas组件)
-窗口坐标系---以窗口的左上角为坐标原点
-窗口坐标系---以画布的左上角为坐标原点
3、画布对象显示的顺序
Canvas组件中创建的画布对象都会被列入显示列表中,越接近背景的画布对象位于显示列表的越下方
4、指定画布对象
Canvas组件提供几种发放可以指定画布对象: -Item handles
-Tags
-ALL
-CURRENT -Item handles:事实上是一个用于指定某个画布对象的整型数字(在画布组件上创建一个画布对象的时候,Tkinter将认为Canvas组件中独一无二的整型值,然后各种Canvas方法可以通过这个值来操纵画布对象。)
-Tags:是附件在画布对象上的标签,Tags由普通的非空白字符串组成。一个画布对象可以和多个Tags相关联,一个Tags也可用于描述多个画布对象。然而,与Text组件不同,没有指定画布对象的Tags不能实际绑定和配置样式,也就是说,Canvas组件的Tags是仅为画布对象所拥有的。
Canvas组件预定义两个Tags:ALL和CURRENT
-ALL或(all)表示Canvas组件中的所有画布对象。
-CURRENT(或current):表示鼠标指针下的画布对象。
GUI的最终选择 Tkinter(六):Canvas组件的更多相关文章
- GUI的最终选择 Tkinter(五):Text用法
Text组件 绘制单行文本使用Label组件,多行选使用Listbox,输入框使用Entry,按钮使用Button组件,还有Radiobutton和Checkbutton组件用于提供单选或多选的情况, ...
- GUI的最终选择 Tkinter(四):Entry、Listbox、Scrollbar和Scale组件
Entry组件 Entry组件就是平时所说的输入框.输入框是程序员用到的最多的一个程序,例如在输入账号和密码的时候需要提供两个输入框,用于接收密码的输入框还会有星号将实际输入的内容隐藏起来. Tkin ...
- GUI的最终选择 Tkinter(七):菜单Menu组件、Menubutton组件、OptionMenu组件
Menu组件 今天说的Menu组件就是一些菜单组件,开始点点点... Tkinter提供了一个Menu组件,可以实现顶级菜单,下拉菜单和弹出菜单.由于底层是代码实现和优化的,所以不太建议通过按钮和其他 ...
- GUI的最终选择 Tkinter(三):Checkbutton组件和Radiobutton组件、LabelFrame组件
Checkbutton组件 Checkbutton组件就是常见的多选按钮,而Radiobutton则是单选按钮 from tkinter import * root = Tk() v = IntVar ...
- GUI的最终选择 Tkinter(二):Label和Button组件
Label组件 Lable组件是用于界面上输出描述的标签,例如提示用户“您下载的电影含有未成年人限制内容,请满18岁以后点击观看!”,先来上结果图: 在来看下它的代码: from tkinter im ...
- GUI的最终选择 Tkinter(八):Message组件、Spinbox组件、PanedWindow组件、Toplevel组件
Message组件 Message(消息)组件是Label组件的变体,用于显示多行文本消息,Message组件能够自动执行,并调整文本的尺寸使其适应给定的尺寸. from tkinter import ...
- GUI的最终选择Tkinter模块初级篇
一.Tkinter模块的基本使用 1)实例化窗口程序 import tkinter as tk app = tk.Tk() app.title("FishC Demo") app. ...
- Python之GUI的最终选择(Tkinter)
首先,Tkinter是Python默认的GUI库,想IDLE就是用Tkinter设计出来的,因此直接导入Tkinter模块就可以啦 1 import tkinter (1)Tkinter初体验: 1 ...
- GUI的最终选择 Tkinter(一):Tkinter最初体验
EasyGui就是一个简单的文字交互界面模块,从今天开始来开始学习Tkinter Tkinter是Python标准的Gui库,它实际是建立在Tk技术上的,Tk最初是为Tcl(一门工具名语言)所涉及的, ...
随机推荐
- BZOJ-3940:Censoring(AC自动机裸题)
Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they have p ...
- HihoCoder1643 : 最少换乘([Offer收割]编程练习赛37)(bfs)
描述 小Ho居住的城市有N条公交车线路,其中第i条线路上有Ki个车站. 某些线路之间会有公共的车站,小Ho可以在这些车站从一条线路换乘到另一条线路. 现在给定N条公交车线路以及两个车站S和E,你能帮助 ...
- docker镜像管理基础
[root@node01 ~]# docker pull quay.io/coreos/flannel:v0.10.0-amd64 v0.10.0-amd64: Pulling from coreos ...
- 关于redis,学会这8点就够了
1,redis是什么 redis是一种支持Key-Value等多种数据结构的存储系统.可用于缓存,事件发布或订阅,高速队列等场景.该数据库使用ANSI C语言编写,支持网络,提供字符串,哈希,列表,队 ...
- poj2492A Bug's Life——带权并查集
题目:http://poj.org/problem?id=2492 所有元素加入同一个并查集中,通过其偏移量%2将其分类为同性与异性,据此判断事件. 代码如下: #include<iostrea ...
- C# 序列化反序列化XML的帮助类
以下是一个包装的用于序列化反序列化XML和C# 对象的类. public class XmlSerializeHelper<T> { #region Serial ...
- POJ3259(ford判环)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 39078 Accepted: 14369 Descr ...
- @SpringBootApplication注解分析
首先我们分析的就是入口类Application的启动注解@SpringBootApplication,进入源码: @Target(ElementType.TYPE) @Retention(Retent ...
- Grunt:GruntFile.js
ylbtech-Grunt:GruntFile.js 1.返回顶部 1. module.exports = function (grunt) { grunt.initConfig({ useminPr ...
- fkmu
杭州赛区J:考虑实质上是求解 (a,b) = 1 且 a*b<=n的数对个数,枚举a,对b容斥. trickgcd:考虑反向求解,即为ans[x] -= ans[t*x],注意到因为反向求所以余 ...