1. 基于tkinter模块的GUI

  • GUI是图形用户界面的缩写,图形化的用户界面对使用过计算机的人来说应该都不陌生,在此也无需进行赘述。
  • Python默认的GUI开发模块是tkinter(在Python 3以前的版本中名为Tkinter),从这个名字就可以看出它是基于Tk的
    • Tk是一个工具包,最初是为Tcl设计的,后来被移植到很多其他的脚本语言中,它提供了跨平台的GUI控件;
    • 当然Tk并不是最新和最好的选择,也没有功能特别强大的GUI控件。
  • 事实上,开发GUI应用并不是Python最擅长的工作,如果真的需要使用Python开发GUI应用,wxPython、PyQt、PyGTK等模块都是不错的选择。

  • 基本上使用tkinter来开发GUI应用需要以下5个步骤:

    • 1.导入tkinter模块中我们需要的东西。
    • 2.创建一个顶层窗口对象并用它来承载整个GUI应用。
    • 3.在顶层窗口对象上添加GUI组件。
    • 4.通过代码将这些GUI组件的功能组织起来。
    • *5.进入主事件循环(main loop)。

tkinter模块常用参数(python3)

案例1:使用tkinter做一个简单的GUI应用

import tkinter
import tkinter.messageboxdef main():flag = True# 修改标签上的文字def change_label_text():nonlocal flag  """ 此处使用:not flag,不能使用False如果使用了False,程序就只能执行一次,之后的flag全部都是False使得嵌套变量和nonlocal函数失去了意义"""flag = not flag   # msg:提示信息color, msg = ('red', 'Hello, world!') \if flag else ('blue', 'Goodbye, world!') # flag为真设置红色,flag为假设置蓝色label.config(text=msg, fg=color)             #  重新配置# 确认退出def confirm_to_quit():if tkinter.messagebox.askokcancel('温馨提示', '确定要退出吗?'):top.quit()# 创建顶层窗口top = tkinter.Tk()# 设置窗口大小,geometry:几何图形top.geometry('240x160') # 设置窗口标题top.title('小游戏')# 创建标签对象并添加到顶层窗口,bg:背景,fg:前景。label = tkinter.Label(top, text='Hello, world!', font='Arial -32', fg='red')label.pack(expand=1)    # 将标签添加到主窗口# 创建一个装按钮的容器panel = tkinter.Frame(top)# 创建按钮对象 指定添加到哪个容器中 通过command参数绑定事件回调函数button1 = tkinter.Button(panel, text='修改', command=change_label_text)  # 修改颜色和文本 button1.pack(side='left')button2 = tkinter.Button(panel, text='退出', command=confirm_to_quit)button2.pack(side='right')panel.pack(side='bottom')# 开启主事件循环tkinter.mainloop()if __name__ == '__main__':main()
  • 需要说明的是,GUI应用通常是事件驱动式的,之所以要进入主事件循环就是要监听鼠标、键盘等各种事件的发生并执行对应的代码对事件进行处理,因为事件会持续的发生,所以需要这样的一个循环一直运行着等待下一个事件的发生。
  • 另一方面,Tk为控件的摆放提供了三种布局管理器,通过布局管理器可以对控件进行定位,这三种布局管理器分别是:Placer(开发者提供控件的大小和摆放位置)、Packer(自动将控件填充到合适的位置)和Grid(基于网格坐标来摆放控件)

2. 使用Pygame进行游戏开发

  • Pygame是一个开源的Python模块,专门用于多媒体应用(如电子游戏)的开发,其中包含对图像、声音、视频、事件、碰撞等的支持。
  • Pygame建立在SDL的基础上,SDL是一套跨平台的多媒体开发库,用C语言实现,被广泛的应用于游戏、模拟器、播放器等的开发。
  • Pygame让游戏开发者不再被底层语言束缚,可以更多的关注游戏的功能和逻辑。

参考pygame中文文档

1. pygame.init():初始化所有导入的 pygame 模块
2. pygame.display.set_mode():初始化一个准备显示的界面
3. pygame.display.set_caption():设置当前窗口的标题
4. pygame.quit():卸载所有导入的 pygame 模块
5. screen.fill():设置窗口背景颜色
6. pygame.draw.circle():绘制一个圆
7. pygame.display.flip():刷新当前窗口(渲染窗口将绘制的图像呈现出来)
8. screen.blit():将一个图片放到一个对象上面(两个参数:image:要放置的图片,position:图片的坐标)
注意:1.blit()不会更新屏幕,它在缓冲区中绘制图像;2.需要结合update()/flip()将缓冲区发送到视频卡,才能绘制出图像来。
9. pygame.time.delay(10):每隔10毫秒就改变小球的位置再刷新窗口

案例2:制作小游戏大球吃小球

第一步:制作游戏窗口

import pygamedef main():# 初始化导入的pygame中的模块pygame.init()# 初始化用于显示的窗口并设置窗口尺寸screen = pygame.display.set_mode((800, 600))# 设置当前窗口的标题pygame.display.set_caption('大球吃小球')running = True# 开启一个事件"循环处理"发生的事件while running:# 从消息队列中获取事件并对事件进行处理for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseif __name__ == '__main__':main()

第二步:在窗口中绘图

  • 可以通过pygame中draw模块的函数在窗口上绘图,可以绘制的图形包括:线条、矩形、多边形、圆、椭圆、圆弧等。
  • 屏幕坐标系是将屏幕左上角设置为坐标原点(0, 0),向右是x轴的正向,向下是y轴的正向,在表示位置或者设置尺寸的时候,我们默认的单位都是像素(像素就是屏幕上的一个点)
  • pygame中表示颜色用的是色光三原色表示法,即通过一个元组或列表来指定颜色的RGB值,每个值都在0~255之间,因为是每种原色都用一个8位(bit)的值来表示,三种颜色相当于一共由24位构成,这也就是常说的“24位颜色表示法”。
import pygamedef main():# 初始化导入的pygame中的模块pygame.init()# 初始化用于显示的窗口并设置窗口尺寸screen = pygame.display.set_mode((800, 600))# 设置当前窗口的标题pygame.display.set_caption('大球吃小球')# 设置窗口的背景色(颜色是由红绿蓝三原色构成的元组)screen.fill((242, 242, 242))# 绘制一个圆(参数分别是: 屏幕, 颜色, 圆心位置, 半径, 0表示填充圆)pygame.draw.circle(screen, (255, 0, 0,), (100, 100), 10, 0)# 刷新当前窗口(渲染窗口将绘制的图像呈现出来)pygame.display.flip()running = True# 开启一个事件循环处理发生的事件while running:# 从消息队列中获取事件并对事件进行处理for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseif __name__ == '__main__':main()

第三步:加载图像

  • 如果需要直接加载图像到窗口上,可以使用pygame中image模块的函数来加载图像,再通过之前获得的窗口对象的blit方法渲染图像。
import pygamedef main():# 初始化导入的pygame中的模块pygame.init()# 初始化用于显示的窗口并设置窗口尺寸screen = pygame.display.set_mode((800, 600))# 设置当前窗口的标题pygame.display.set_caption('大球吃小球')# 设置窗口的背景色(颜色是由红绿蓝三原色构成的元组)screen.fill((255, 255, 255))# 通过指定的文件名加载图像ball_image = pygame.image.load('D:/360Safe/ball.png')# 在窗口上渲染图像screen.blit(ball_image, (50, 50))# 刷新当前窗口(渲染窗口将绘制的图像呈现出来)pygame.display.flip()running = True# 开启一个事件循环处理发生的事件while running:# 从消息队列中获取事件并对事件进行处理for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseif __name__ == '__main__':main()

第四步:实现动画效果

  • 事实上要实现动画效果,本身的原理也非常简单,就是将不连续的图片连续的播放,只要每秒钟达到了一定的帧数,那么就可以做出比较流畅的动画效果。
  • 如果要让上面代码中的小球动起来,可以将小球的位置用变量来表示,并在循环中修改小球的位置再刷新整个窗口。
import pygamedef main():# 初始化导入的pygame中的模块pygame.init()# 初始化用于显示的窗口并设置窗口尺寸screen = pygame.display.set_mode((800, 600))# 设置当前窗口的标题pygame.display.set_caption('大球吃小球')# 定义变量来表示小球在屏幕上的位置x, y = 50, 50running = True# 开启一个事件循环处理发生的事件while running:# 从消息队列中获取事件并对事件进行处理for event in pygame.event.get():if event.type == pygame.QUIT:running = Falsescreen.fill((255, 255, 255))pygame.draw.circle(screen, (255, 0, 0,), (x, y), 30, 0)pygame.display.flip()# 每隔50毫秒就改变小球的位置再刷新窗口pygame.time.delay(30)x, y = x + 5, y + 5if __name__ == '__main__':main()

第五步:碰撞检测

  • 通常一个游戏中会有很多对象出现,而这些对象之间的“碰撞”在所难免,比如炮弹击中了飞机、箱子撞到了地面等。
  • 碰撞检测在绝大多数的游戏中都是一个必须得处理的至关重要的问题,pygame的sprite(动画精灵)模块提供了对碰撞检测的支持。
  • 要检测两个小球有没有碰撞so easy:
    • 只需要检查球心的距离有没有小于两个球的半径之和。
  • 为了制造出更多的小球,我们可以通过对鼠标事件的处理,在点击鼠标的位置创建颜色、大小和移动速度都随机的小球,因此我们可以把之前学习到的面向对象的知识应用起来。
from enum import Enum, unique
from math import sqrt
from random import randint
import tkinterimport pygame@unique
class Color(Enum):"""颜色"""RED = (255, 0, 0)GREEN = (0, 255, 0)BLUE = (0, 0, 255)BLACK = (0, 0, 0)WHITE = (255, 255, 255)GRAY = (242, 242, 242)@staticmethoddef random_color():"""获得随机颜色"""r = randint(0, 255)g = randint(0, 255)b = randint(0, 255)return (r, g, b)class Ball(object):"""球"""def __init__(self, x, y, radius, sx, sy, color=Color.RED):"""初始化方法"""self.x = xself.y = yself.radius = radiusself.sx = sxself.sy = syself.color = colorself.alive = Truedef move(self, screen):"""移动"""self.x += self.sxself.y += self.syif self.x - self.radius <= 0 or \self.x + self.radius >= screen.get_width():self.sx = -self.sxif self.y - self.radius <= 0 or \self.y + self.radius >= screen.get_height():self.sy = -self.sydef eat(self, other):"""吃其他球"""if self.alive and other.alive and self != other:dx, dy = self.x - other.x, self.y - other.ydistance = sqrt(dx ** 2 + dy ** 2)if distance < self.radius + other.radius \and self.radius > other.radius:other.alive = Falseself.radius = self.radius + int(other.radius * 0.146)def draw(self, screen):"""在窗口上绘制球"""pygame.draw.circle(screen, self.color,(self.x, self.y), self.radius, 0)

第六步:事件处理

  • 可以在事件循环中对鼠标事件进行处理,通过事件对象的type属性可以判定事件类型
  • 再通过pos属性就可以获得鼠标点击的位置
  • 如果要处理键盘事件也是在这个地方,做法与处理鼠标事件类似
def main():# 定义用来装所有球的容器balls = []# 初始化导入的pygame中的模块pygame.init()# 初始化用于显示的窗口并设置窗口尺寸screen = pygame.display.set_mode((800, 600))# 设置当前窗口的标题pygame.display.set_caption('大球吃小球')running = True# 开启一个事件循环处理发生的事件while running:# 从消息队列中获取事件并对事件进行处理for event in pygame.event.get():if event.type == pygame.QUIT:running = False# 处理鼠标事件的代码if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:# 获得点击鼠标的位置x, y = event.posradius = randint(10, 100)sx, sy = randint(-10, 10), randint(-10, 10)color = Color.random_color()# 在点击鼠标的位置创建一个球(大小、速度和颜色随机)ball = Ball(x, y, radius, sx, sy, color)# 将球添加到列表容器中balls.append(ball)screen.fill((255, 255, 255))# 取出容器中的球 如果没被吃掉就绘制 被吃掉了就移除for ball in balls:if ball.alive:ball.draw(screen)else:balls.remove(ball)pygame.display.flip()# 每隔50毫秒就改变球的位置再刷新窗口pygame.time.delay(50)for ball in balls:ball.move(screen)# 检查球有没有吃到其他的球for other in balls:ball.eat(other)def confirm_to_quit():if tkinter.messagebox.askokcancel('温馨提示', '确定要退出吗?'):top.quit()#     # 创建顶层窗口
#     top = tkinter.Tk()
#     # 创建一个装按钮的容器
#     panel = tkinter.Frame(top)
#     # 创建按钮对象 指定添加到哪个容器中 通过command参数绑定事件回调函数
#     button1 = tkinter.Button(panel, text='退出', command=confirm_to_quit)
#     button1.pack(side='right')
#     panel.pack(side='bottom')
#     # 开启主事件循环
#     tkinter.mainloop()if __name__ == '__main__':main()
注释:本篇博客是借助GitHub上大牛的学习博客,再加上了我自己的粗浅理解,通过这种方式记录自己的学习历程。

GitHub原文连接

Python学习笔记 十一:图形用户界面和小游戏开发相关推荐

  1. python打开界面是什么样的-python学习笔记(图形用户界面)

    GUI python提供了多个图形开发界面的库,几个常用Python GUI库如下: Tkinter: Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的 ...

  2. python打开界面-python学习笔记(图形用户界面)

    GUI python提供了多个图形开发界面的库,几个常用Python GUI库如下: Tkinter: Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的 ...

  3. Python学习笔记007_图形用户界面[EasyGui][Tkinter]

    EasyGui官网:http://easygui.sourceforge.net/ EasyGui最新版:easygui-0.97.rar 小甲鱼根据官网文档翻译之后的中文文档地址: http://b ...

  4. Python学习笔记·交互式图形编程

    Python学习笔记·交互式图形编程 注:在校计算机学生一名,菜鸟一枚,最近开始学习Python的基础知识希望有什么不对的地方各位大佬能够不令赐教! 课程是在中国大学MOOC上学的,有兴趣的同学可以自 ...

  5. 微直播笔记|三十分钟微信小游戏开发入门

    微信小游戏在2017年12月28日正式上线.相对于传统的H5游戏,小游戏的优势十分明显,拥有微信庞大的用户量以及更好的兼容性,在天生适合微信社交生态的同时还不用担心被屏蔽.无疑,这或许是一个巨大的风口 ...

  6. Python学习笔记十一:面向对象

    面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类 ...

  7. python学习笔记(十一)-python程序目录工程化

    在一个程序当中,一般都会包含文件夹:bin.conf.lib.data.logs,以及readme文件. 所写程序存放到各自的文件夹中,如何进行串联? 首先,通过导入文件导入模块方式,引用其他人写好的 ...

  8. 计算机图形学 学习笔记 OpenGL图形用户界面和交互输入

    目录 OpenGL支持交互式输入设备的函数 GLU鼠标函数 GLUT键盘函数 OpenGL的菜单功能 创建GLUT菜单 创建和管理多个GLUT菜单 创建GLUT子菜单 修改GLUT菜单 OpenGL支 ...

  9. cocos2d-x 学习笔记(4)cocos2d-x 小游戏类似打地鼠(含源码)

    源码下载 http://download.csdn.net/detail/u011261250/5719559 这是我自学一星期写的,cocos2d-x版本是2.1.4,是一个简单的类似打地鼠的游戏, ...

最新文章

  1. 禁用Browser Link
  2. 管理Exchange服务器
  3. Vue的表单组件之下拉框
  4. qtp连接mysql 无驱动_QTP连接MySQL
  5. 关于深圳城中村小产权房,你应该知道的
  6. freerdp linux下连接windows远程终端工具
  7. java模块依赖关系_链接模块依赖关系未解决
  8. 重新签名IOS .ipa文件 (包含第三方框架和插件)
  9. Xcode中的iOS工程模板
  10. 一个简单的python登录验证系统
  11. 国内首个SENT 信号解析软件 适配NXP KMA321, melexis MLX90372等SENT信号输出芯片 完美替代PicoScope 解析SENT
  12. DRP:分销链上的精灵(转)
  13. 计算机访问网络延迟越低越好吗,内存延迟参数是否越低越好
  14. linux 浮点异常,浮点数学函数异常处理方法
  15. LaTeX代码: 表格 ← 利用 tabular
  16. 学Linux到底学什么
  17. excel表格末尾添加一行_这样输入Excel公式,也太快了吧......
  18. 什么是MyBatis
  19. 2021蓝桥杯省赛b题解
  20. 大文件分片上传前后端实现

热门文章

  1. java8系列02——Stream流
  2. 美容院的股权激励方式
  3. Flask中post和get的区别
  4. vscode里面进行git提交
  5. Android组件(二)Intent
  6. java-php-net-python-二手书商城系统计算机毕业设计程序
  7. 去年,那些人,那些事
  8. 软件测试人员的职业规划 西安尚学堂
  9. Python sftp上传文件 速度过慢
  10. Idea打包项目war并且发布到服务器