使用wxPython的GLCanvas时鼠标点击事件被阻塞的问题
解决wxPython中GLCanvas鼠标点击事件无法实时响应的问题
问题场景
在macOS环境(Python 3.10、wxPython 4.2.1、PyOpenGL 3.1.7)下,创建包含GLCanvas的wxFrame应用,绑定EVT_LEFT_DOWN事件后,点击事件的打印信息无法实时输出,需等待程序关闭后才会一次性显示所有点击记录。
原因分析
并非主线程mainLoop阻塞事件分发,而是macOS系统下Python标准输出的行缓冲机制导致:GUI程序中print的输出不会实时刷新到终端,默认会累积到缓冲区,直到程序退出时才一次性释放。
解决方案
方案1:强制刷新单条print输出
修改MyCanvas类中的on_left_down方法,为print添加flush=True参数,强制实时刷新缓冲区:
def on_left_down(self, event): x, y = event.GetPosition() print(f"Mouse clicked at ({x}, {y})", flush=True)
方案2:全局设置无缓冲输出
在程序开头导入sys模块并修改标准输出配置,让所有输出实时刷新:
import sys sys.stdout = sys.stdout.buffer.raw # 后续原有代码... import wx from wx import glcanvas # ...
验证效果
修改后重新运行程序,点击GLCanvas区域时,终端会实时打印点击坐标,无需等待程序关闭即可看到输出。
内容的提问来源于stack exchange,提问作者caol64
相关产品推荐
相关产品推荐

