python库tkinter、pygame中几点需要注意的问题
恍然之间已经16年快四月份了,已经好久都没有写过东西了。。
最近在用python做一些小的游戏,在网上找了一些Python库,Python中游戏编程最常用的还是pygame了,其次是Tkinter
pygame的话是专门用来写一些小的游戏的库,非常好用。
这里想说的主要是关于他的事件处理,在pygame中他的事件处理主要通过一个事件队列进行处理。
while True:
screen.blit(image_board, (0, 0))
for event in pygame.event.get():
if event.type == QUIT:
exit()
if event.type == MOUSEBUTTONDOWN:
mouse_position = pygame.mouse.get_pos()
world.answer_mouse(mouse_position)
world.render()
pygame.display.update()
这里是一个小的demo中主程序中的一部分,整体通过一个while死循环,在死循环中通过update函数进行不断的画面更新,并且在获取事件时,通过for循环遍历事件队列,这里用的是get函数,另外还有wait函数,这其中的区别可以从字面上去理解,wait是要通过等待一个事件产生后进行处理,可能会有卡顿的感觉
这里我是要处理鼠标的点击事件,很明显get函数的效果要更好,wait函数的适用范围,我也不是很了解
这里可以看到,如果使用pygame的话是要通过自己声明的while死循环,显示的进行事件的处理与画面的更新
另外,关于Tkinter库,他主要用来进行GUI的绘制,但其实也不是非常好用,但功能上还是挺全面的。前两天看到网上有人写关于贪食蛇的小的demo,但切入的角度主要的算法,自己对算法还是不怎么在行,主要就说下关于Tkinter中进行游戏编写的一些问题
tk = Tk() def start():
snake_game = SnakeGame(tk, 500)
tk.mainloop() class SnakeGame(object):
def __init__(self, tk, speed):
self.food = (randint(0, 20), randint(0, 20))
self.speed = speed
self.snake = Snake()
self.tk = tk
self.button = Button(tk, text="start game!", command=self.run)
self.canvas = Canvas(tk, width=410, height=410, bg="black")
self.button.pack()
self.canvas.pack()
self.tk.bind("<KeyPress-Up>", self.up_event)
self.tk.bind("<KeyPress-Down>", self.down_event)
self.tk.bind("<KeyPress-Right>", self.right_event)
self.tk.bind("<KeyPress-Left>", self.left_event) def run(self):
if self.snake.eat(self.food):
eat_flag = 1
self.food = None
else:
eat_flag = 0
self.snake.move(eat_flag)
if self.not_over():
self.canvas.delete("all")
self.draw_food()
self.draw_snake()
self.tk.after(self.speed, self.run)
else:
r = tkMessageBox.showinfo("Oh,game over!")
if r == "ok":
sys.exit()
这里是自己前两天写贪食蛇小的demo的部分程序,用的是Tkinter,其中并没有发现有显示的while主循环,但在主程序中出现了一个mainloop的函数,同时在Snake类的run方法里有tk.after的函数
在Tkinter中如果要进行画面的绘制要通过Tk.canvas进行绘制,但如果要进行画面的时刻更新则要通过tk.after()函数
这个函数接受两个参数,第一个是经过多少毫秒执行,第二个是想要执行的函数名
这里一定要注意一个问题,第二个参数最好不要加括号,就是写成self.run,而不是self.run(),开始时笔者是加括号的,但是程序一直无法运行,显示递归超出范围,在网上查了下,Python的递归是有深度限制的,大概900多。但如果去掉(),就没有这样的问题,是不是类似于javascript中的函数立即执行的方式
第二点要注意的是,要在你要执行的函数底部加上tk.after()函数,不能只在主函数中调用after函数,这样只会执行一次。
另外,在Tkinter中对于事件的处理是要通过绑定到界面来进行的,类似于SnakeGame.__init__(),将KeyPress事件通过bind函数绑定到tk上,再通过mainloop主循环进行事件的处理,但同时mainloop循环也控制着Tkinter整个窗口的生命周期,即如果不执行mainloop循环,Tkinter窗口会关闭,即使有tk.after()函数的执行。
即mainloop函数中有着事件处理的循环和Tkinter窗口生命周期的控制
总体来看编写游戏上,还是pygame的条理更为清晰一些,更好用一些
下面是笔者的github地址,有一些小的demo和以前做电赛的程序
python库tkinter、pygame中几点需要注意的问题的更多相关文章
- _markupbase.py if not match: UnboundLocalError: local variable 'match' referenced before assignment,分析Python 库 html.parser 中存在的一个解析BUG
BUG触发时的完整报错内容(本地无关路径用已经用 **** 隐去): **************\lib\site-packages\bs4\builder\_htmlparser.py:78: U ...
- python 库安装笔记
python 库安装笔记 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-2-22 友情提示 安装python库的过程中 ...
- Anaconda 安装 Python 库(MySQLdb)的方法
[已解决]Anaconda 安装 Python 库(MySQLdb)的方法 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 201 ...
- Anaconda 安装 Python 库(MySQLdb)的方法-(转)
安装python库的过程中,最重要的地方就是版本需要兼容.其中操作系统为64位,Python为2.X 64位,下载安装文件的时候也要注意版本匹配.其中文件名中包含的cp27表示CPython 2.7版 ...
- 【python游戏编程之旅】第七篇---pygame中的冲突检测技术
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中的Sprite模块和如何加载动画:http://www.cnblogs ...
- 【python游戏编程之旅】第六篇---pygame中的Sprite(精灵)模块和加载动画
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 直到现在我们已经学了很多pygame基础知识了,从这篇博客开始我们将会学习pygame中高级部分,更多和精灵 ...
- 【python游戏编程之旅】第四篇---pygame中加载位图与常用的数学函数。
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇博客中,我们学习了pygame事件与设备轮询.http://www.cnblogs.com/msxh ...
- 【python游戏编程之旅】第二篇--pygame中的IO、数据
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇中,我们介绍了pygame的入门操作http://www.cnblogs.com/msxh/p/49 ...
- python - 在Windows系统中安装Pygame及导入Eclipse
环境:python3.6(只有一个版本)+ windows10(64 bit) + Eclipse+pydev python3.6安装完成后,会自带 easy_install 和 pip3,在Win ...
随机推荐
- 理解事件捕获。在限制范围内拖拽div+吸附+事件捕获
一.实现的效果是在限制范围内拖拽div+吸附+事件捕获. 这里需要理解的是事件捕获,这个事件捕获也是为了兼容div在拖拽过程中,文本不被选中这个问题. 如此良辰美景,拖拽也可以很洒脱哈.先看看图, 二 ...
- 開始折腾cocos2d-x,使用批处理来创建项目
開始抽出时间学习cocos2d-x了.尽管C和C++还都不咋地.只是在开发中学习记忆也许会更深吧. so决定从今天開始正式学习的用自己的空暇时间折腾它了.正好这个五一没什么事.昨天搭建了一下开发环境. ...
- MVC中一般为什么用IQueryable而不是用IList
IList(IList<T>)会立即在内存里创建持久数据,这就没有实现“延期执行(deferred execution)”,如果被加载的实体有关联实体(associations),此关联实 ...
- DragQueryFile
附件:http://files.cnblogs.com/xe2011/CSharp_DragQueryFile.rar using System.Runtime.InteropServices; th ...
- 【OpenCV十六新手教程】OpenCV角检测Harris角点检测
本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/29356187 作者:毛星云(浅墨) ...
- Spark1.0 安装
1.下载Scala wget http://www.scala-lang.org/files/archive/scala-2.10.3.tgz tar xvzf scala-2.10.3.tgz - ...
- Mysql show Status参数详解
状态名 作用域 详细解释 Aborted_clients Global 由于客户端没有正确关闭连接导致客户端终止而中断的连接数 Aborted_connects Global 试图连接到MySQL服务 ...
- Java基础知识强化之IO流笔记27:FileInputStream读取数据一次一个字节数组byte[ ]
1. FileInputStream读取数据一次一个字节数组byte[ ] 使用FileInputStream一次读取一个字节数组: int read(byte[] b) 返回值:返回值其实是实际 ...
- CentOS6.5编译安装最新MySQL 5.7.11
安装前工作:1,从官方网址下载MySQL5.7.11源码包,大概49M2,安装好CentOS6.5 64位操作系统.建议update操作系统,以便是此版本最新的3. yum -y install g ...
- WPF学习之资源-Resources
WPF学习之资源-Resources WPF通过资源来保存一些可以被重复利用的样式,对象定义以及一些传统的资源如二进制数据,图片等等,而在其支持上也更能体现出这些资源定义的优越性.比如通过Resour ...