文章目录
前边已经了解到编程的很多基本要素:输入和输出、变量、判断、循环、列表、函数、对象和模块。下边开始就要用Python完成一些更有意思的事情啦!
比如如何在屏幕上画画,比如直线、形状、颜色,还会了解一下动画。想想就心动哈~~
1. 准备工作
要让图形和声音在计算机上起作用,这涉及到操作系统和图形卡,还需要大量的底层代码。所以我们可以使用一个名为Pygame的Python模块来提供帮助,具体戳这里:Pygame安装与相关事宜
2. Pygame窗口
开始绘制图形前首先建立一个窗口:
import pygame
pygame.init()
sceen = pygame.display.set_mode([640,480])
运行会弹出一个黑色的窗口
但是它很快就停止了,在Python中只有程序运行时才会处于打开状态。所以必须保证程序一直运行。
要想保证Pygame事件循环一直运行,一种方法是使用while循环:
import pygame
pygame.init()
sceen = pygame.display.set_mode([640,480])
while True:
pass
让Pygame窗口可以使用“X”图标关闭:
import pygame,sys
pygame.init()
sceen = pygame.display.set_mode([640,480])
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
3. 在窗口画圆
代码中[640,480]是窗口的大小,表示640像素宽,480像素宽:
import pygame,sys
pygame.init()
sceen = pygame.display.set_mode([640,480])
sceen.fill([255,255,255])
pygame.draw.circle(sceen,[255,0,0],[100,100],30,0)
pygame.display.flip()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
在我们使用“X”图标将它关闭之前它会一直打开:
(1) 翻转
对于Pygame窗口中显示的所有内容,Python中的显示对象(如上例中的screen),都会有这些内容的两个副本。这样做的原因是,开始动画时,我们希望动画尽可能流畅,速度尽可能快。所以不必在每次对图形做一个小小的修改是都更新显示。可以做很多修改后再“翻转”到图形的新版本。
可以把两个副本当作一个“当前屏”和一个“下一屏”。当前屏就是我们现在看到的,下一屏是完成“翻转”之后看到的。做完“下一屏”上的修改后,再翻转到下一屏,就能看到这些改变。
(2)如何建立一个圆
如上边的运行结果显示,靠近窗口左上角有一个红色的圆。这是因为pygame.draw,circle( )函数会画一个圆,必须在画之前告诉它以下五件事:
- 在哪个表面画这个圆(很明显我们定义的是screen)。
- 用什么颜色来画(在这里用的红色,对应值为[255,0,0])。
- 在什么位置画(在这里位于[100,100],这里表示从左上角向下100像素再向右100像素的位置)。
- 圆的大小(这里是30,这是圆的半径,单位是像素)。
- 线宽(如果width = 0,圆完全是填充的,这里就采用了完全填充)。
像素是“图像元素”的简写。这表示屏幕上或图像中的一点。比如有时我们说的这个屏幕 “分辨率是1024X768” 指的就是计算机屏幕有768行像素,每行有1024个像素。
下边具体说说这五件事:
① Pygame表面
在实际生活中,如果让你画一幅画,你可能会先问“我在哪画?”在Pygame中,我们要在一个表面上画图。显示表面就是我们在屏幕上看到的表面(也就是screen)。不过pygame程序可以有多个表面,可以把图像从一个表面复制到另一个表面。还可以对表面做一些处理,比如旋转或者调整它们的大小。
前面提到,显示表面有两个副本。其实就是显示表面是双缓冲的。正是这个原因,我们不会在屏幕上看到只画了一半的形状和图像。
② Pygame中的颜色
Pygame中使用的颜色系统是很多计算机语言和程序中通用的系统,称为RGB。这里的R、G和B分别代表红、绿和蓝。
美术课上可能讲过,通过结合或混合光的三原色(红、绿和蓝)可以得到任何颜色。计算机也采用了同样的做法。每个颜色对应一个从0到255的数。
如果所有数都是0,就没有任何颜色,这就是全黑。
如果三个数都是255,会将3种颜色的最大亮度混合在一起,这就是白色。
如果颜色是[255,0,0],这就是纯红色,没有绿色和蓝色。
纯绿就是[0,255,0]。
纯蓝是[0,0,255]。
如果所有三个数都一样,比如[150,150,150],会得到某种灰度。数字越小,灰度越深;数字越大,灰度就越浅。
③ 屏幕位置——坐标
这有两个数:一个对应x轴(水平方向),还有一个对应y轴(垂直方向)。在Pygame中、这两个数从窗口左上角的[0,0]坐标开始。
类似[320,240]的一对数,第一个数表示水平方向,即相对左边界的距离,第二个数表示垂直方向,即相对于顶边的距离。
将上例中的[100,100]改为[320,240]再次键入:
import pygame,sys
pygame.init()
sceen = pygame.display.set_mode([640,480])
sceen.fill([255,255,255])
pygame.draw.circle(sceen,[255,0,0],[320,240],30,0)
pygame.display.flip()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
④ 形状大小
使用Pygamede的draw函数画形状时,必须指定形状和尺寸,对于圆来说,只有一个尺寸——半径。而像矩形之类的形状,则必须指定长和宽。
Pygame有一种特殊的对象,名为rect(这是“rectangle”的简写),用来定义矩形区域。rect要使用左上角坐标、宽和高来定义:
Rect(left, top, width, height)
这里同时定义了位置和大小:
my_rect = Rect(250, 150, 300, 200)
这会创建一个矩形。它的左上角距离左边界250像素,距离窗口上边界150像素,宽为300像素,高为200像素。即:
pygame.draw.rect(sceen,[255,0,0],[250, 150, 300, 200],0)
把上边程序修改为:
import pygame,sys
pygame.init()
sceen = pygame.display.set_mode([640,480])
sceen.fill([255,255,255])
pygame.draw.rect(sceen,[255,0,0],[250, 150, 300, 200],0)
pygame.display.flip()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
我们用Rect(left, top, width, height)创建一个矩形,还可以使用其他一些属性来移动和对齐这个Rect:
- 4个边:top、left、bottom、right
- 4个角:topleft、bottomleft、topright、bottomright
- 每条边的中点:midtop、midleft、midbottom、midright
- 中心:center、centerx、centery
- 尺寸:size、width、height
⑤ 线宽
画形状时最后需要指定的一点是线的粗细。在之前的例子中,我们使用的线宽都是0,这会填充整个形状。如果使用不同的线宽,会看到形状的轮廓。
试着把线宽改为2:
pygame.draw.rect(sceen,[255,0,0],[250, 150, 300, 200],2)
运行试试。
⑥ 现代艺术
键入:
import pygame,sys,random
pygame.init()
sceen = pygame.display.set_mode([640,480])
sceen.fill([255,255,255])
for i in range(100):
width = random.randint(0,255)
height = random.randint(0,100)
top = random.randint(0,400)
left = random.randint(0,500)
pygame.draw.rect(sceen, [0,0,0], [left,top,width,height], 1)
pygame.display.flip()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
上边这个程序就是可以随机画100个大小不等、位置不同的矩形,为了更有趣一点,我们再增加上颜色,另外线宽也设为随机:
import pygame,sys,random
from pygame.color import THECOLORS
pygame.init()
sceen = pygame.display.set_mode([640,480])
sceen.fill([255,255,255])
for i in range(100):
width = random.randint(0,255)
height = random.randint(0,100)
top = random.randint(0,400)
left = random.randint(0,500)
color_name = random.choice(THECOLORS.keys())
color = THECOLORS[color_name]
line_width = random.randint(1,3)
pygame.draw.rect(sceen, [0,0,255], [left,top,width,height], line_width)
pygame.display.flip()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()