一、tkinter模块的GUI
基本上使用tkinter来开发GUI应用需要以下5个步骤:
导入tkinter模块中我们需要的东西。
创建一个顶层窗口对象并用它来承载整个GUI应用。
在顶层窗口对象上添加GUI组件。
通过代码将这些GUI组件的功能组织起来。
进入主事件循环(main loop)。
代码:
1 import tkinter
2 import tkinter.messagebox
3
4 def main():
5 flag = True
6 #修改标签上的文字
7 def change_label_text():
8 nonlocal flag
9 flag = not flag
10 color,msg = ('red','hello,world')\
11 if flag else ('blue','Goodbye,world!')
12 label.config(text=msg, fg=color)
13 #确认退出
14 def confirm_to_quit():
15 if tkinter.messagebox.askokcancel('温馨提示','确认要退出吗?'):
16 top.quit()
17
18 #创建顶层窗口
19 top = tkinter.Tk()
20 #设置窗口大小
21 top.geometry('240x160')
22 #设置窗口标题
23 top.title('小游戏')
24 #创建标签对象并添加到顶层窗口
25 label = tkinter.Label(top,text='hello,world!',font = 'Arial -32',fg = 'red')
26 label.pack(expand = 1)
27 #创建一个装按钮的容器
28 panel = tkinter.Frame(top)
29 #创建按钮对象 指定添加到哪个容器中 通过command参数绑定事件回调函数
30 button1 = tkinter.Button(panel,text = '修改',command = change_label_text)
31 button1.pack(side = 'left')
32 button2 = tkinter.Button(panel,text = '退出',command = change_label_text)
33 button2.pack(side = 'right')
34 panel.pack(side = 'bottom')
35 #开启主事件循环
36 tkinter.mainloop()
37 #主函数
38 if __name__ == '__main__':
39 main()
二、pygame的游戏窗口
制作游戏窗口
1 import pygame
2 def main():
3 # 初始化导入pygame中的模块
4 pygame.init()
5 #初始化用于显示的窗口并设置窗口尺寸
6 screen = pygame.display.set_mode((800,600))
7 # 设置当前窗口的标题
8 pygame.display.set_caption('大球吃小球')
9 running = True
10 # 开启一个事件 循环处理发生的事件
11 while running:
12 for event in pygame.event.get():
13 if event.type == pygame.QUIT:
14 running = False
15 if __name__ == '__main__':
16 main()
运行效果:
三、往游戏窗口里画一个圆
通过pygame中draw模块的函数在窗口上绘图,可以绘制的图形包括:线条、矩形、多边形、圆、椭圆、圆弧等。需要说明的是,屏幕坐标系是将屏幕左上角设置为坐标原点(0, 0),向右是x轴的正向,向下是y轴的正向,在表示位置或者设置尺寸的时候,我们默认的单位都是像素。所谓像素就是屏幕上的一个点,你可以用浏览图片的软件试着将一张图片放大若干倍,就可以看到这些点。pygame中表示颜色用的是色光三原色表示法,即通过一个元组或列表来指定颜色的RGB值,每个值都在0~255之间,因为是每种原色都用一个8位(bit)的值来表示,三种颜色相当于一共由24位构成,这也就是常说的“24位颜色表示法”。
1 import pygame
2 def main():
3 # 初始化导入pygame中的模块
4 pygame.init()
5 #初始化用于显示的窗口并设置窗口尺寸
6 screen = pygame.display.set_mode((800,600))
7 # 设置当前窗口的标题
8 pygame.display.set_caption('大球吃小球')
9
10 # 设置窗口的背景色
11 screen.fill((242,242,242))
12 # 绘制一个圆,参数分别为:(屏幕,颜色,圆心位置,半径,0表示填充圆)
13 pygame.draw.circle(screen,(255,0,0),(100,100),30,0)
14 # 刷新当前窗口
15 pygame.display.flip()
16 running = True
17 # 开启一个事件 循环处理发生的事件
18 while running:
19 for event in pygame.event.get():
20 if event.type == pygame.QUIT:
21 running = False
22 if __name__ == '__main__':
23 main()
画了一个圆:
四、加载图像
使用pygame中image模块的函数来加载图像,再通过之前获得的窗口对象的blit方法渲染图像。
ball_image = pygame.image.load(“ball.png”)
# 刷新当前窗口
pygame.display.flip()
效果图
五、实现动画效果
要让上面代码中的小球动起来,可以将小球的位置用变量来表示,并在循环中修改小球的位置再刷新整个窗口即可。
import pygame
def main():
# 初始化导入pygame中的模块
pygame.init()
#初始化用于显示的窗口并设置窗口尺寸
screen = pygame.display.set_mode((800,600))
# 设置当前窗口的标题
pygame.display.set_caption('大球吃小球')
# 定义变量来表示小球在屏幕上的位置
x,y = 50,50
running = True
# 开启一个事件 循环处理发生的事件
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 设置窗口的背景色
screen.fill((255, 255, 255))
# 绘制一个圆,参数分别为:(屏幕,颜色,圆心位置,半径,0表示填充圆)
pygame.draw.circle(screen,(255,0,0),(x,y),30,0)
# 刷新当前窗口
pygame.display.flip()
# 每隔50毫秒改变小球的位置
pygame.time.delay(50)
x,y = x+5,y+5
running = True
if __name__ == '__main__':
main()
效果图
六、加入碰撞检测,做成一个大球吃小球小游戏
代码
from enum import Enum,unique
from math import sqrt
from random import randint
import 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)
#随机获取颜色
def 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 = x
self.y = y
self.radius = radius
self.sx = sx
self.sy = sy
self.color = color
self.alive = True
def move(self,screen):
"""移动"""
self.x += self.sx
self.y += self.sy
if self.x - self.radius <= 0 or self.x + self.radius >= screen.get_width():
self.sx = -self.sx
if self.y - self.radius <= 0 or self.y + self.radius >= screen.get_width():
self.sy = -self.sy
def eat(self,other):
"""吃其他球"""
if self.alive and other.alive and self != other:
dx,dy = self.x - other.x,self.y-other.y
distance = sqrt(dx**2 + dy ** 2)
if distance other.radius:
other.alive = False
self.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)
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.pos# 获取鼠标点击的事件
radius = 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)
if __name__ == '__main__':
main()
最终效果图:
作者:侠客小飞