You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在事件中检测鼠标按下或屏幕触摸?is_pressed()函数疑问

解决按住鼠标左键移动时无法触发高亮的问题

你提到的event.is_pressed()确实是用来检测单次按键/点击事件的,但它只在按键按下的瞬间事件(比如MOUSEBUTTONDOWN)中有效。当你按住左键移动鼠标时,触发的是鼠标移动事件(比如MOUSEMOTION),这时候事件对象的is_pressed()并不会返回true——因为这个事件本身不是由按键按下触发的,而是由移动触发的。

要解决这个问题,你需要换一种方式:在移动事件中主动查询当前鼠标按键的持续状态,而不是依赖事件对象的is_pressed()方法。以Pygame为例(从你的tiles和LMB描述推测你可能用这个库),可以这样修改代码:

import pygame

# 假设你的初始化和tiles对象已经定义好
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        
        # 处理点击瞬间的高亮
        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:  # 1代表鼠标左键
                tiles.highlight()
        
        # 处理按住左键移动时的高亮
        elif event.type == pygame.MOUSEMOTION:
            # 获取当前所有鼠标按键的状态,返回的是一个元组,索引0对应左键
            mouse_buttons = pygame.mouse.get_pressed()
            if mouse_buttons[0]:
                tiles.highlight()
    
    # 其他渲染逻辑
    pygame.display.flip()

核心原因解释:

  • event.is_pressed()是绑定到单个事件的,比如MOUSEBUTTONDOWN事件只在按下瞬间触发,它的is_pressed()只会在这个事件周期内为true;而MOUSEMOTION事件是每帧移动时触发,事件对象本身不携带"按键持续按下"的状态。
  • pygame.mouse.get_pressed()是实时获取当前鼠标的按键状态,不管当前触发的是什么事件,只要左键处于按住状态,就能检测到。

如果你用的是其他GUI/游戏库(比如Pyglet、Tkinter),思路也是类似的:找到对应库中实时查询按键状态的API,在移动事件回调中检查左键是否持续按下,再触发tiles.highlight()。

内容的提问来源于stack exchange,提问作者Keith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:15:24