Pygame跨模块定义控制逻辑调用时事件不生效问题如何解决
问题原因与解决方案
根本原因
问题出在Python的模块变量导入和绑定逻辑上:
- 你在
pygameinitmodule中初始化了全局event_list,主文件和othermodule执行from pygameinitmodule import *时,只是把pygameinitmodule.event_list的引用复制到了当前模块自己的作用域中,两个模块的event_list初始指向同一个对象,但后续互不影响。 - 主循环中执行的
event_list = pygame.event.get(),是给主文件自身作用域下的event_list变量重新赋值,完全不会修改pygameinitmodule中存储的event_list值。因此othermodule中读取的event_list永远是程序初始化阶段的旧值,自然无法生效。 - 你把控制逻辑直接复制到主循环时,读取的是主循环刚更新的当前作用域下的
event_list,所以可以正常运行。
可行解决方案
方案1(最推荐,低耦合):将事件列表作为参数传入控制函数
直接放弃跨模块全局变量的方案,调用函数时主动传入当前最新的事件列表:
- 主文件调用逻辑修改:
from pygameinitmodule import * import othermodule running = True while running: event_list = pygame.event.get() if certaingamestate: # 传入当前最新的事件列表 othermodule.controlFunction(event_list)
othermodule的函数定义修改:
# 不需要再导入全局event_list,直接用参数接收 def controlFunction(event_list): for event in event_list: # 原有控制逻辑
方案2(适配原有全局变量逻辑):统一操作源模块的全局变量
如果要保留全局变量的写法,所有模块都直接操作pygameinitmodule下的event_list,不要在各自模块单独赋值:
- 主文件修改:
import pygameinitmodule import othermodule import pygame running = True while running: # 直接修改源模块的全局变量,而非当前模块的局部变量 pygameinitmodule.event_list = pygame.event.get() if certaingamestate: othermodule.controlFunction()
othermodule修改:
import pygameinitmodule def controlFunction(): # 直接读取源模块的最新全局变量 for event in pygameinitmodule.event_list: # 原有控制逻辑
内容的提问来源于stack exchange,提问作者Aqualuzara
相关产品推荐
相关产品推荐

