Author
: Seven_0507
Date
: 2019-05-22
文章目录
Python图形用户界面和游戏开发1. tkinter模块2. Pygame进行游戏开发
Python图形用户界面和游戏开发
1. tkinter模块
"""
使用tkinter创建GUI
- 顶层窗口
- 控件
- 布局
- 事件回调
"""
import tkinter
import tkinter
.messagebox
def main():
flag
= True
def change_label_text():
nonlocal flag
flag
= not flag
if flag
:
color
, msg
= ('red', 'Hello, world!')
else:
color
, msg
= ('blue', 'Goodbye, world!')
label
.config
(text
=msg
, fg
=color
)
def confirm_to_quit():
if tkinter
.messagebox
.askokcancel
('温馨提示', '确定要退出吗?'):
top
.quit
()
top
= tkinter
.Tk
()
top
.geometry
('240x160')
top
.title
('小游戏')
label
= tkinter
.Label
(top
, text
='Hello, world!', font
='Arial -32', fg
='red')
label
.pack
(expand
=1)
panel
= tkinter
.Frame
(top
)
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
()
"""
使用tkinter创建GUI
- 在窗口上制作动画
"""
import tkinter
import time
def play_animation():
canvas
.move
(oval
, 2, 2)
canvas
.update
()
top
.after
(50, play_animation
)
x
= 10
y
= 10
top
= tkinter
.Tk
()
top
.geometry
('600x600')
top
.title
('动画效果')
top
.resizable
(False, False)
top
.wm_attributes
('-topmost', 1)
canvas
= tkinter
.Canvas
(top
, width
=600, height
=600, bd
=0, highlightthickness
=0)
canvas
.create_rectangle
(0, 0, 600, 600, fill
='gray')
oval
= canvas
.create_oval
(10, 10, 60, 60, fill
='red')
canvas
.pack
()
top
.update
()
play_animation
()
tkinter
.mainloop
()
"""
用turtle模块绘图
这是一个非常有趣的模块 它模拟一只乌龟在窗口上爬行的方式来进行绘图
"""
import turtle
turtle
.pensize
(3)
turtle
.penup
()
turtle
.goto
(-180, 150)
turtle
.pencolor
('red')
turtle
.fillcolor
('yellow')
turtle
.pendown
()
turtle
.begin_fill
()
for _
in range(36):
turtle
.forward
(200)
turtle
.right
(170)
turtle
.end_fill
()
turtle
.mainloop
()
2. Pygame进行游戏开发
"""
大球吃小球游戏步骤
- 制作游戏窗口
- 在窗口中绘图
- 加载图像
- 实现动画效果
- 碰撞检测
"""
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)
@
staticmethod
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_height
():
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
< self
.radius
+ other
.radius \
and self
.radius
> 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
.init
()
screen
= pygame
.display
.set_mode
((800, 600))
print(screen
.get_width
())
print(screen
.get_height
())
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
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
()
pygame
.time
.delay
(50)
for ball
in balls
:
ball
.move
(screen
)
for other
in balls
:
ball
.eat
(other
)
if __name__
== '__main__':
main
()
pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
800
600