PyGame批量模拟键盘指令输入需求及现有代码问题
解决方案
要实现按下回车键后自动模拟指定按键序列并输出对应信息,我们可以通过pygame.event.post()手动生成键盘事件,同时控制事件发送节奏避免一次性触发所有操作。以下是修改后的完整代码:
import pygame from pygame.locals import * class Test(): def __init__(self): # 定义需要模拟的按键序列 self.simulate_keys = [K_1, K_2, K_3] # 模拟状态控制变量 self.is_simulating = False self.current_key_idx = 0 self.last_send_time = 0 # 每个按键模拟的间隔(毫秒) self.send_interval = 500 def mainloop(self): rot_slice_map = {K_1: 'pressed key 1', K_2: 'pressed key 2', K_3: 'pressed key 3'} while True: current_time = pygame.time.get_ticks() # 处理模拟按键逻辑 if self.is_simulating: # 达到间隔时间,发送下一个按键事件 if current_time - self.last_send_time >= self.send_interval: if self.current_key_idx < len(self.simulate_keys): key = self.simulate_keys[self.current_key_idx] # 生成并发送KEYDOWN事件 pygame.event.post(pygame.event.Event(KEYDOWN, key=key)) self.last_send_time = current_time self.current_key_idx += 1 else: # 模拟完成,重置状态 self.is_simulating = False self.current_key_idx = 0 # 处理事件队列 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() if event.type == KEYDOWN: # 监听回车键,触发模拟 if event.key == K_RETURN: if not self.is_simulating: self.is_simulating = True self.last_send_time = current_time # 处理真实或模拟的按键事件 if event.key in rot_slice_map: print(rot_slice_map[event.key]) def main(): pygame.init() display = (800,600) pygame.display.set_mode(display, DOUBLEBUF|OPENGL) test = Test() test.mainloop() if __name__ == '__main__': main() pygame.quit() exit()
关键修改说明
- 添加模拟控制变量:在
__init__中定义模拟按键序列、模拟状态、当前索引和时间戳,用于控制模拟流程的启停与节奏。 - 回车键触发模拟:监听
K_RETURN的KEYDOWN事件,启动模拟流程。 - 生成模拟按键事件:通过
pygame.event.post()创建并发送KEYDOWN事件,让主循环的事件处理逻辑可以像处理真实按键一样响应。 - 控制模拟间隔:使用
pygame.time.get_ticks()记录上次发送事件的时间,确保每个按键模拟之间有固定间隔,避免一次性输出所有信息。
内容的提问来源于stack exchange,提问作者BH10001
相关产品推荐
相关产品推荐

