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

Posted dhjabc_1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于pygame实现鼠标键盘监听事件响应,有趣的实验的主要内容,如果未能解决你的问题,请参考以下文章

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

Mac 鼠标/键盘事件的监听和模拟

pygame与列表元素结合实现有趣的堆栈效果,进来看看咯。

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听