MacOS下PyQT6调用exec()弹窗遇CFMessagePortSendRequest(-1)错误的解决咨询
问题描述
在MacOS系统中使用PyQT6开发时,通过exec()方法打开对话框以阻塞程序执行,直至获取对话框操作结果,代码如下:
if dialog.exec() == QDialog.DialogCode.Accepted: print("Adding...") else: print("Adding cancelled")
但频繁出现以下错误信息:
TSMSendMessageToUIServer: CFMessagePortSendRequest FAILED(-1) to send to port com.apple.tsm.uiserver
错误含义与解决方案
错误含义
该错误和MacOS的**TSM(Text Services Manager)**相关,TSM负责系统文本输入服务(如输入法、文本快捷键等)。错误表示PyQt对话框尝试与系统TSM UI服务通信时失败,通常是模态对话框(exec()创建的是模态对话框)与MacOS UI服务线程交互冲突,或是程序UI线程未正确处理系统服务请求导致的。
解决方案
- 改用
show()配合信号槽替代exec():放弃阻塞式的exec(),使用非模态的show(),通过对话框的accepted和rejected信号处理结果,避免线程阻塞引发的TSM通信问题。示例代码:dialog = YourDialogClass() dialog.accepted.connect(lambda: print("Adding...")) dialog.rejected.connect(lambda: print("Adding cancelled")) dialog.show() - 确保UI操作在主线程执行:PyQt所有UI操作必须在主线程完成,若对话框在子线程中调用
exec(),必然出现此类系统服务通信问题,需将对话框的创建与调用移至主线程。 - 升级PyQt6版本:部分旧版本PyQt6在MacOS上存在TSM交互bug,升级至最新稳定版可修复该问题。
- 重置MacOS的TSM服务:若系统TSM服务异常,可通过终端执行以下命令重启相关服务(执行后建议重启应用):
killall -u $USER cfprefsd killall -u $USER TextInputMenuAgent
内容的提问来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

