pygame实现鼠标键盘监听事件响应,有趣的实验

一、PyGame 鼠标键盘事件

事件类型有很多种,例如: QUIT 和 MOUSEMOTION 等, 这些预定义的事件类型作为常量定义在 pygame.local 模块中,下面这些是最早的事件类型和它们的属性,后面不同的版本又补充了例如手势等事件,具体参考官方文档:

QUIT              none
ACTIVEEVENT       gain, state
KEYDOWN           key, mod, unicode, scancode
KEYUP             key, mod
MOUSEMOTION       pos, rel, buttons
MOUSEBUTTONUP     pos, button
MOUSEBUTTONDOWN   pos, button
JOYAXISMOTION     joy, axis, value
JOYBALLMOTION     joy, ball, rel
JOYHATMOTION      joy, hat, value
JOYBUTTONUP       joy, button
JOYBUTTONDOWN     joy, button
VIDEORESIZE       size, w, h
VIDEOEXPOSE       none
USEREVENT         code

我们可以在程序中模拟一下:

import pygame
pygame.init()
resolution = width, height = 480, 700
windowSurface = pygame.display.set_mode(resolution)  # 设置分辨率并得到全局的绘图表面
pygame.display.set_caption("鼠标键盘操作")

clock = pygame.time.Clock()
while True:
    # 处理用户输入
    for event in pygame.event.get():
        # 处理事件
        print(str(event))

    # 刷新界面
    pygame.display.flip()

    # 时钟停留一帧的时长
    clock.tick(60)

通过print(str(event))然后在运行过程就,就会输出很多信息。
在这里插入图片描述
输出的数据有:

<Event(5-MouseButtonDown {'pos': (162, 375), 'button': 1, 'window': None})>
<Event(6-MouseButtonUp {'pos': (162, 375), 'button': 1, 'window': None})>
<Event(2-KeyDown {'unicode': '', 'key': 100, 'mod': 0, 'scancode': 32, 'window': None})>
<Event(3-KeyUp {'key': 100, 'mod': 0, 'scancode': 32, 'window': None})>
<Event(2-KeyDown {'unicode': '', 'key': 102, 'mod': 0, 'scancode': 33, 'window': None})>
<Event(3-KeyUp {'key': 102, 'mod': 0, 'scancode': 33, 'window': None})>
<Event(2-KeyDown {'unicode': '', 'key': 102, 'mod': 0, 'scancode': 33, 'window': None})>

二、键盘操作

该模块包含处理与键盘操作相关的函数。当键盘按键被按下和释放时,事件队列将获得 pygame.KEYDOWN 和 pygame.KEYUP 事件消息。这两个消息均包含 key 属性,是一个整数的 id,代表键盘上具体的某个按键。

pygame.KYEDOWN 事件还有个额外的属性 unicode 和 scancode。unicode 代表一个按键翻译后的 Unicode 编码,这包含 shift 按键和组合键。scancode 是扫描码,不同键盘间该值可能不同。不过这对于特殊按键像多媒体键的选择是有用的。

(一)键盘常量

key 属性的值是一个数字,为了方便使用,Pygame 将这些数字定义为以下这些常量:
在这里插入图片描述

(二)第一种操作

pygame.KEYDOWN键盘按下事件, 返回三个参数:
(1)event.unicode按键的Unicode码
(2)event.key键盘的常量名称
(3) event.mod键盘修饰符的组合值

import pygame,sys

pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("pygame处理事件")

while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.unicode == "":
                print("[KEYDOWN]:", "#",event.key,event.mod,pygame.key.name(event.key))
            else:
                print("[KEYDOWN]:",event.unicode,event.key,event.mod,pygame.key.name(event.key))

    pygame.display.update()

输出情况:

在这里插入图片描述
输出结果:

[KEYDOWN]: # 306 0 left ctrl
[KEYDOWN]:  99 64 c
[KEYDOWN]: # 306 0 left ctrl
[KEYDOWN]:  99 64 c
[KEYDOWN]: # 306 0 left ctrl
[KEYDOWN]:  99 64 c
[KEYDOWN]: # 304 0 left shift
[KEYDOWN]: # 301 8192 caps lock
[KEYDOWN]: J 106 8192 j
[KEYDOWN]: K 107 8192 k
[KEYDOWN]: # 304 8192 left shift
[KEYDOWN]: j 106 8193 j
[KEYDOWN]: # 304 0 left shift
[KEYDOWN]: J 106 1 j

(三)第二种操作

使用pygame.key.get_pressed() 返回所有被按下按键的元组
使用键盘常量,判断元组中某一个按键是否被按下,被按下对应数值为:

keys_pressed = pygame.key.get_pressed()
if keys_pressed[pygame.K_RIGHT]:
    print("向右移动")

演示代码如下:

import pygame,sys

pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("pygame处理事件")

while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()
    bools = pygame.key.get_pressed()
    # print(len(bools),type(bools))
    try:
        print(bools.index(1))
        print(pygame.key.name(bools.index(1)))
    except:
        pass
    pygame.display.update()

输出结果:
在这里插入图片描述
输出文本:

pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
32
space
32
space
32
space
32
space
32
space
32
space

三、鼠标操作

import pygame,sys

pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("pygame处理事件")

while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()
        elif event.type == pygame.MOUSEMOTION:
            print("[MOUSEMOTTON]:", event.pos, event.rel, event.buttons)
            """pygame.MOUSEMOTTION鼠标移动事件,
            event.pos鼠标当前坐标值(x,y)相对于窗口左上角。
            event.rel鼠标相对移动距离(X,Y),相对于上次事件。
            event.buttons鼠标按钮状态(a,b,c),相对于鼠标的三个键(左中右),
            鼠标移动时,这三个键处于按下状态,对应的位置为1,
            反之为0"""
        elif event.type == pygame.MOUSEBUTTONUP:
            print("[MOUSEBUTTONUP]:", event.pos, event.button)
            """pygame.MOUSEBUTTONUP鼠标释放事件,
            event.button鼠标按下键编号n,取值0/1/2,分别对应三个键"""
        elif event.type == pygame.MOUSEBUTTONDOWN:
            print("[MOUSEBUTTONDOWN]:", event.pos, event.button)
            """pygame.MOUSEBUTTONDOWN鼠标键按下事件,
            event.button鼠标按下键编号n,取值为整数,
            左键为1,右键为3"""

    pygame.display.update()

输出结果:
在这里插入图片描述
输出文本:

[MOUSEMOTTON]: (396, 266) (1, 0) (0, 0, 0)
[MOUSEMOTTON]: (397, 266) (1, 0) (0, 0, 0)
[MOUSEMOTTON]: (398, 267) (1, 1) (0, 0, 0)
[MOUSEMOTTON]: (399, 267) (1, 0) (0, 0, 0)
[MOUSEMOTTON]: (400, 268) (1, 1) (0, 0, 0)
[MOUSEMOTTON]: (401, 269) (1, 1) (0, 0, 0)
[MOUSEMOTTON]: (403, 269) (2, 0) (0, 0, 0)
[MOUSEBUTTONDOWN]: (403, 269) 1

四、键盘监听案例

import pygame,sys

pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("pygame处理事件")

info = pygame.font.SysFont("microsoftyaheimicrosoftyaheiui", 160)
key = None
while True:
    screen.fill((0,0,0))
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.unicode == "":
                print("[KEYDOWN]:", "#",event.key,event.mod,pygame.key.name(event.key))
                key = pygame.key.name(event.key)
            else:
                print("[KEYDOWN]:",event.unicode,event.key,event.mod,pygame.key.name(event.key))
                key = event.unicode
    textSurface = info.render("%s" % key, True, (255, 255, 255))

    # 绘制文字在(10,10)位置
    screen.blit(textSurface, (10, 10))

    pygame.display.update()

输出的动图为:
在这里插入图片描述

五、鼠标监听案例

import pygame,sys
flag = 20
pygame.init()
WIDTH = 800
HEIGHT = 700
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('pygame处理事件')
fcclock = pygame.time.Clock()
select = False
start = None
rect_rect = None
while True:
    screen.fill((0,0,0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT or event.type == pygame.K_F1:
            pygame.quit()
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            start = x, y = pygame.mouse.get_pos()  # 获取鼠标位置,鼠标就是需要打击的目标
            select = True
        if event.type == pygame.MOUSEBUTTONUP:
            select = False
        if event.type == pygame.MOUSEMOTION:
            if select:
                x, y = pygame.mouse.get_pos()
                rect_rect=(start[0],start[1],x-start[0],y-start[1])
    if rect_rect is not None:
        pygame.draw.rect(screen, (255, 0, 0), rect_rect, 2)
    fcclock.tick(60)
    pygame.display.flip()  # 刷新窗口

输出结果:
在这里插入图片描述

OK,写完了一篇流水篇,希望大家喜欢。
呵呵。

参考资料:
https://blog.csdn.net/David_Aulier/article/details/105262806?utm_source=app&app_version=4.8.0&code=app_1562916241&uLinkId=usr1mkqgl919blen

  • 11
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值