pygame 事件

Posted wkfvawl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pygame 事件相关的知识,希望对你有一定的参考价值。

程序在运行期间会产生许许多多的事件,事件随时可能发生(如移动鼠标,点击鼠标,敲击键盘按键),Pygame的做法是将所有的事件都放到事件队列里,通过for循环语句迭代取出每一条事件,然后处理关注的事件即可。

 

下面的代码可以将程序运行过程中产生的所有事件都记录并存放到一个文件中:

import pygame
import sys

# 初始化Pygame
pygame.init()

size = width, height = 600, 400
screen = pygame.display.set_mode(size)
pygame.display.set_caption("初次见面,请大家多多关照!")

f = open("record.txt", w)

while True:
    for event in pygame.event.get():
        f.write(str(event) + 
)
        if event.type == pygame.QUIT:
            f.close()
            sys.exit()

 

接下来我们想要将程序运行中产生的事件都显示在屏幕上。这就要涉及到在屏幕上显示文字的功能,或者说是在Surface上显示文字,但pygame并不能办法直接在Surface对象上面显示文字,因此需要调用font模块的render()方法,将文字渲染成为Surface对象,这样就可以调用blit()方法讲一个Surface对象放到另外一个上了。

 

import pygame
import sys

# 初始化Pygame
pygame.init()

size = width, height = 600, 400
screen = pygame.display.set_mode(size)
pygame.display.set_caption("FishC Demo")
bg = (0, 0, 0)#黑色的背景
#创建font对象
font = pygame.font.Font(None, 20)
#第一个参数指定字体,第二个参数指定字体的尺寸
line_height = font.get_linesize()
#调用get_linesize()方法获得每行文本的高度
position = 0
screen.fill(bg)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

        screen.blit(font.render(str(event), True, (0, 255, 0)), (0, position))
        #render方法将文本渲染成Surface对象
        #第一个参数是待渲染的文本
        #第二个参数是指定是否消除锯齿
        #第三个参数指定文本的颜色
        position += line_height
        
        if position > height:#满屏时清屏
            position = 0
            screen.fill(bg)

    pygame.display.flip()

 

程序运行显示效果:

技术图片

 

这里再列举Pygame常用的事件及其含义:

 

技术图片

 

利用所学的关于事件的知识,这里将小乌龟设置成可以被控制移动。

import pygame
import sys
from pygame.locals import *#将pygame的所有常量名导入

# 初始化Pygame
pygame.init()

size = width, height = 600, 400
speed = [0, 0]
bg = (255, 255, 255) # RGB

# 创建指定大小的窗口 Surface
screen = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption("初次见面,请大家多多关照!")

# 加在图片
turtle = pygame.image.load("turtle.png")
# 获得图像的位置矩形
position = turtle.get_rect()

l_head = turtle#左转
r_head = pygame.transform.flip(turtle, True, False)#右转

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

        if event.type == KEYDOWN:
            if event.key == K_LEFT:
                turtle = l_head
                speed = [-10, 0]#向左移动
            if event.key == K_RIGHT:
                turtle = r_head
                speed = [10, 0]#向右移动
            if event.key == K_UP:
                speed = [0, -10]#向上移动
            if event.key == K_DOWN:
                speed = [0, 10]#向右移动

    # 移动图像
    position = position.move(speed)
    speed = [0, 0]
    if position.left < 0 or position.right > width:
        #翻转图像
        turtle = pygame.transform.flip(turtle, True, False)
        # 反方向移动
        speed[0] = -speed[0]
    if position.top < 0 or position.bottom > height:
        speed[1] = -speed[1]

    # 填充背景
    screen.fill(bg)
    # 更新图像
    screen.blit(turtle, position)
    # 更新界面
    pygame.display.flip()
    # 延迟10毫秒
    pygame.time.delay(10)

 

这里再给出一些表示键盘上按键的键盘常量的列表,来自pygame官网。https://www.pygame.org/docs/ref/key.html

KeyASCII      ASCII   Common Name
K_BACKSPACE         backspace
K_TAB               tab
K_CLEAR               clear
K_RETURN            return
K_PAUSE               pause
K_ESCAPE      ^[      escape
K_SPACE               space
K_EXCLAIM     !       exclaim
K_QUOTEDBL    "       quotedbl
K_HASH        #       hash
K_DOLLAR      $       dollar
K_AMPERSAND   &       ampersand
K_QUOTE               quote
K_LEFTPAREN   (       left parenthesis
K_RIGHTPAREN  )       right parenthesis
K_ASTERISK    *       asterisk
K_PLUS        +       plus sign
K_COMMA       ,       comma
K_MINUS       -       minus sign
K_PERIOD      .       period
K_SLASH       /       forward slash
K_0           0       0
K_1           1       1
K_2           2       2
K_3           3       3
K_4           4       4
K_5           5       5
K_6           6       6
K_7           7       7
K_8           8       8
K_9           9       9
K_COLON       :       colon
K_SEMICOLON   ;       semicolon
K_LESS        <       less-than sign
K_EQUALS      =       equals sign
K_GREATER     >       greater-than sign
K_QUESTION    ?       question mark
K_AT          @       at
K_LEFTBRACKET [       left bracket
K_BACKSLASH          backslash
K_RIGHTBRACKET ]      right bracket
K_CARET       ^       caret
K_UNDERSCORE  _       underscore
K_BACKQUOTE   `       grave
K_a           a       a
K_b           b       b
K_c           c       c
K_d           d       d
K_e           e       e
K_f           f       f
K_g           g       g
K_h           h       h
K_i           i       i
K_j           j       j
K_k           k       k
K_l           l       l
K_m           m       m
K_n           n       n
K_o           o       o
K_p           p       p
K_q           q       q
K_r           r       r
K_s           s       s
K_t           t       t
K_u           u       u
K_v           v       v
K_w           w       w
K_x           x       x
K_y           y       y
K_z           z       z
K_DELETE              delete
K_KP0                 keypad 0
K_KP1                 keypad 1
K_KP2                 keypad 2
K_KP3                 keypad 3
K_KP4                 keypad 4
K_KP5                 keypad 5
K_KP6                 keypad 6
K_KP7                 keypad 7
K_KP8                 keypad 8
K_KP9                 keypad 9
K_KP_PERIOD   .       keypad period
K_KP_DIVIDE   /       keypad divide
K_KP_MULTIPLY *       keypad multiply
K_KP_MINUS    -       keypad minus
K_KP_PLUS     +       keypad plus
K_KP_ENTER          keypad enter
K_KP_EQUALS   =       keypad equals
K_UP                  up arrow
K_DOWN                down arrow
K_RIGHT               right arrow
K_LEFT                left arrow
K_INSERT              insert
K_HOME                home
K_END                 end
K_PAGEUP              page up
K_PAGEDOWN            page down
K_F1                  F1
K_F2                  F2
K_F3                  F3
K_F4                  F4
K_F5                  F5
K_F6                  F6
K_F7                  F7
K_F8                  F8
K_F9                  F9
K_F10                 F10
K_F11                 F11
K_F12                 F12
K_F13                 F13
K_F14                 F14
K_F15                 F15
K_NUMLOCK             numlock
K_CAPSLOCK            capslock
K_SCROLLOCK           scrollock
K_RSHIFT              right shift
K_LSHIFT              left shift
K_RCTRL               right control
K_LCTRL               left control
K_RALT                right alt
K_LALT                left alt
K_RMETA               right meta
K_LMETA               left meta
K_LSUPER              left Windows key
K_RSUPER              right Windows key
K_MODE                mode shift
K_HELP                help
K_PRINT               print screen
K_SYSREQ              sysrq
K_BREAK               break
K_MENU                menu
K_POWER               power
K_EURO                Euro

 

以上是关于pygame 事件的主要内容,如果未能解决你的问题,请参考以下文章

嵌入 PyQt 时 Pygame 不返回事件

有没有办法用 MOUSEBUTTONDOWN 事件关闭 pygame 窗口?

Pygame blit图像与鼠标事件

14天学习训练营之 入门Pygame

秒会Pygame:键盘移动和鼠标点击移动物体的方法(含完整的代码)

Python进阶篇八Pygame的Event事件模块