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(一门工具名语言)所涉及的, ...
随机推荐
- hihocoder1075【开锁魔法】
hihocoder1075[开锁魔法] 题意是给你一个 \(1-n\) 的置换,求选 \(k\) 个可以遍历所有点的概率. 题目可以换个模型:有 \(n\) 个球,有 \(cnt\) 种不同的颜色,求 ...
- 前端多媒体(4)—— video标签全面分析
测试地址:https://young-cowboy.github.io/gallery/html5_video/index.html 属性 一些属性是只读的,一些属性是可以修改从而影响视频播放的. a ...
- Eclipse IDE 主题颜色
已安装好的 Eclipse IDE help > install new software 打开窗口 输入地址 http://eclipse-color-theme.github.io/upda ...
- leetcode 307. Range Sum Query - Mutable(树状数组)
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...
- Highcharts小数保留两位方法
tooltip: { valueSuffix: '%', formatter:function(){ return''+this.series.name+' '+Highcharts.numberFo ...
- BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组
BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟 ...
- 洛谷 P4336 黑暗前的幻想乡 —— 容斥+矩阵树定理
题目:https://www.luogu.org/problemnew/show/P4336 当作考试题了,然而没想出来,呵呵. 其实不是二分图完美匹配方案数,而是矩阵树定理+容斥... 就是先放上所 ...
- TCP 连接的握手信息详解
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...
- 原生app与WebApp的区别
Native App开发Native App开发即我们所称的传统APP开发模式(原生APP开发模式),该开发针对IOS.Android等不同的手机操作系统要采用不同的语言和框架进行开发,该模式通常是由 ...
- HashMap的clear方法
我们都知道HashMap的clear()方法会清楚map的映射关系,至于怎么实现的呢? 下面先看一下clear()方法的源码 public void clear() { Node<K,V> ...