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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:07:03