用Python中的tkinter模块作图(续)
八、显示文字
用create_text在画布上写字。这个函数只需要两个坐标(文字x和y的位置),还有一个具名参数来接受要显示的文字。例如:
>>> from tkinter import*
>>> tk = Tk()
>>> canvas = Canvas(tk,width=400,height=400)
>>> canvas.pack()
>>> canvas.create_text(150,100,text='Happy birthday to you')
create_text函数还有几个很有用的参数,比方说字体颜色等。在下面的代码中,我们调用create_text函数时使用了坐标(130,120),还有要显示的文字,以及红色的填充色:
canvas.create_text(130,120,text='Happy birthday to you!',fill='red')
我们还可以指定字体,方法是给出一个包含字体名和字体大小的元组。例如大小为20的Times字体就是('Times',20):
>>> canvas.create_text(150,150,text='Happy birthday',font=('Times',15))
>>> canvas.create_text(200,200,text='Happy birthday',font=('Courier',22))
>>> canvas.create_text(220,300,text='Happy birthday',font=('Couried',30))
九、显示图片
要用tkinter在画布上显示图片,首先要装入图片,然后使用canvas对象上的create_image函数。
这是我存在E盘上的一张图片:
我们可以这样来显示one.gif图片:
>>> from tkinter import*
>>> tk = Tk()
>>> canvas = Canvas(tk,width=400,height=400)
>>> canvas.pack()
>>> my_image = PhotoImage(file='E:\\FFOutput\\one.gif')
>>> canvas.create_image(0,0,anchor = NW,image = my_image)
>>> canvas.create_image(50,50,anchor = NW,image = my_image)
在第五行中,把图片装入到变量my_image中。坐标(0,0)/(50,50)是我们要显示图片的位置, anchor=NW让函数使用左上角(northwest 西北方)作为画图的起始点,最后一个具名参数image指向装入的图片。
注:用tkinter只能装入GIF图片,也就是扩展名是.gif的图片文件。
想要显示其他类型的图片,如PNG和JPG,需要用到其他的模块,比如Python图像库。
十、创建基本的动画
创建一个填了色的三角形,让它在屏幕上横向移动:
import time
from tkinter import*
tk = Tk()
canvas = Canvas(tk,width=400,height=200)
canvas.pack()
canvas.create_polygon(10,10,10,60,50,35) ##创建三角形
for x in range(0,60):
canvas.move(1,5,0) ##把任意画好的对象移动到把x和y坐标增加给定值的位置
tk.update() ##强制tkinter更新屏幕(重画)
time.sleep(0.05) ##让程序休息二十分之一秒(0.05秒),然后再继续
三角形横向移动
延伸一下,如果想让三角形沿对角线在屏幕上移动,我们可以第8行为:
import time
from tkinter import*
tk = Tk()
canvas = Canvas(tk,width=400,height=400)
canvas.pack()
canvas.create_polygon(10,10,10,60,50,35) ##创建三角形
for x in range(0,60):
canvas.move(1,5,5) ##把任意画好的对象移动到把x和y坐标增加给定值的位置
tk.update() ##强制tkinter更新屏幕(重画)
time.sleep(0.05) ##让程序休息二十分之一秒(0.05秒),然后再继续
三角形沿对角线移动
如果要让三角形在屏幕上沿对角线回到开始的位置,要用-5,-5(在结尾处加上这段代码)
import time
from tkinter import*
tk = Tk()
canvas = Canvas(tk,width=400,height=400)
canvas.pack()
canvas.create_polygon(10,10,10,60,50,35) ##创建三角形
for x in range(0,60):
canvas.move(1,5,5) ##把任意画好的对象移动到把x和y坐标增加给定值的位置
tk.update() ##强制tkinter更新屏幕(重画)
time.sleep(0.05) ##让程序休息二十分之一秒(0.05秒),然后再继续
for x in range(0,60):
canvas.move(1,-5,-5)
tk.update()
time.sleep(0.05)
对角线运动并回到初始位置
十一、让对象对操作有反应
我们可以用“消息绑定”来让三角形在有人按下某键时有反应。
要开始处理事件,我们首先要创建一个函数。当我们告诉tkinter将某个特定函数绑到(或关联到)某个特定事件上时就完成了绑定。
换句话说,tkinter会自动调用这个函数来处理事件。
例如,要让三角形在按下回车键时移动,我们可以定义这个函数:
def movetriangle(event):
canvas.move(1,5,0)
这个函数只接受一个参数(event),tkinter用它来给函数传递关于事件的信息。现在我们用画布canvas上的bind_all函数来告诉tkinter当特定事件发生时应该调用这个函数。代码如下:
from tkinter import*
tk = Tk()
canvas = Canvas(tk,width=400,height=400)
canvas.pack()
canvas.create_polygon(10,10,10,60,50,35)
def movetriangle(event):
canvas.move(1,5,0)
canvas.bind_all('<KeyPress-Return>',movetringle) ##让tkinter监视KeyPress事件,当该事件发生时调用movetriangle函数
那么我们如何根据按键的不同而改变三角形的方向呢?比如用方向键。
我们可以尝试改下movetriangle函数:
def movetriangle(event):
if event.keysym == 'up':
canvas.move(1,0,-3) ##第一个参数使画布上所画的形状的ID数字,第二个是对x(水平方向)坐标增加的值,第三个是对y(垂直方向)坐标增加的值
elif event.keysym == 'down':
canvas.move(1,0,3)
elif event.keysym == 'left':
canvas.move(1,-3,0)
else
canvas.move(1,3,0)
最后代码汇总在一起为:
from tkinter import*
tk = Tk()
canvas = Canvas(tk,width=400,height=400)
canvas.pack()
canvas.create_polygon(10,10,10,60,50,35)
def movetriangle(event):
if event.keysym == 'Up':
canvas.move(1,0,-3) ##第一个参数使画布上所画的形状的ID数字,第二个是对x(水平方向)坐标增加的值,第三个是对y(垂直方向)坐标增加的值
elif event.keysym == 'Down':
canvas.move(1,0,3)
elif event.keysym == 'Left':
canvas.move(1,-3,0)
else:
canvas.move(1,3,0)
canvas.bind_all('<KeyPress-Up>',movetriangle) ##让tkinter监视KeyPress事件,当该事件发生时调用movetriangle函数
canvas.bind_all('<KeyPress-Down>',movetriangle)
canvas.bind_all('<KeyPress-Left>',movetriangle)
canvas.bind_all('<KeyPress-Right>',movetriangle)
方向键控制三角形的移动
十二、更多使用ID的方法
只要用了画布上面以create_开头的函数,它总会返回一个ID。这个函数可以在其他的函数中使用。
如果我们修改代码来把返回值作为一个变量保存,然后使用这个变量,那么无论返回值是多少,这段代码都能工作:
>>> mytriangle = canvas.create_polygon(10,10,10,60,50,35)
>>> canvas.move(mytriangle,5,0)
我们可以用itemconfig来改变三角形的颜色,这需要把ID作为第一个参数:
>>> canvas.itemconfig(mytrigle,fill='bue') ##把ID为变量mytriangle中的值的对象的填充颜色改为蓝色
也可以给三角形一条不同颜色的轮廓线,同样适用ID作为第一个参数:
>>> canvas.itemconfig(mytrigle,outline='red')
总结
- 做出了简单的动画。
- 学会了如何用事件绑定来让图形响应按键,这在写计算机游戏时很有用。
- 在tkinter中以create开头的函数是如何返回一个ID数字。
已经学习Python两天,最开始是想着是通过觉得用它写个动画或者画个图形比较方便,而且界面美观,比黑洞洞的dos窗口好多了,准备写个程序送个一女孩作为生日礼物(去年答应好的)。经过这两天的学习,我慢慢发觉了Python语言的优点,其最主要的就是易学,而且可以调用各种库。
用Python中的tkinter模块作图(续)的更多相关文章
- 用Python中的tkinter模块作图
tkinter 可以用来创建完整的应用程序,比如简单的字处理软件,还有简单的绘图软件. 一.创建一个可以点的按钮 用tkinter创建一个带按钮的简单程序,代码如下: >>> fro ...
- python中的Tkinter模块
Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同样可以应用在Windows和Macinto ...
- 关于python中的tkinter模块
python2.7和python3.6中的tkinter是两个包,不会自动升级,假如在fedora28做开发的话, 错误:用import Tkinter /import tkinter /import ...
- Python中的random模块,来自于Capricorn的实验室
Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...
- Python中的logging模块
http://python.jobbole.com/86887/ 最近修改了项目里的logging相关功能,用到了python标准库里的logging模块,在此做一些记录.主要是从官方文档和stack ...
- Python中的random模块
Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...
- 浅析Python中的struct模块
最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概了解了,在这里做一下简单的总结. 了解c语言 ...
- python中的StringIO模块
python中的StringIO模块 标签:python StringIO 此模块主要用于在内存缓冲区中读写数据.模块是用类编写的,只有一个StringIO类,所以它的可用方法都在类中.此类中的大部分 ...
- 折腾Python中的Tkinter
折腾Python中的Tkinter 从oschina看到了关于Python的Tkinter简介: Tk图形用户界面 Tkinter 又从Python官网文档: Tkinter — Python int ...
随机推荐
- angular中的jqLite所包含的jquery API
Angular本身包含了一个叫做jqLite的可兼容性库. 使用过的angular.element()方法就返回一个jqLite对象, jqLite是jQuery库的子集,它 允许Angular以跨 ...
- shutil 高级文件操作
High-level file operations 高级的文件操作模块,官网:https://docs.python.org/2/library/shutil.html# os模块提供了对目录或者 ...
- (转)Using Python3.5 in Ubuntu - Trusty
转自:https://www.reddit.com/r/IPython/comments/3lf81w/using_python35_in_ubuntu_trusty/Note:照这个方案安装pyth ...
- 【Android】事件输入系统-代码层次解读
本文基于Android-4.0 理论层次解读 请看:www.cnblogs.com/lcw/p/3373214.html 如何管理各种驱动设备 在理论中谈到EventHub,这个一看就是一个做实事的, ...
- 【Android】事件处理系统
linux输入子系统 Android是linux内核的,所以它的事件处理系统也在linux的基础上完成的. Linux内核提供了一个Input子系统来实现的,Input子系统会在/dev/input/ ...
- 本地存储localStorage以及它的封装接口store.js的使用
本地存储localStorage以及它的封装接口store.js的使用 sublime-text chrome javascript readyGo 2016年11月20日发布 0 推荐 9 收藏 ...
- audio音乐播放
1.audio标签 <audio @play="ready" @error="error" ref="audio" :src=&quo ...
- Netty高性能之Reactor线程模型
Netty是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用 ...
- chrome访问不了go语言中文网
最近开发转用golang语言,所以经常在晚上搜资料,结果发现go语言中文网,我居然访问不了,刚开始以为是跟go有关,所以被防火长城屏蔽了,结果,偶尔讨论发现办公室的其他两个同事都可以访问,真是奇了怪了 ...
- 【Linux】crontab 每隔1小时 2小时的执行job写法
crontab -l crontab -e 每五分钟执行 */5 * * * * 每小时执行 0 * * * * 每2小时执行 0 */2 * * * 每天执行 0 0 ...