如何阻止Mac上Tkinter输出"[CATransaction synchronize] called within transaction"?
解决MacOS 13.0下Tkinter文件对话框日志刷屏问题
方法1:重定向标准错误输出
直接屏蔽干扰日志,适合不需要保留其他标准错误输出的场景:
import sys from tkinter import filedialog as fd original_stderr = sys.stderr sys.stderr = open('/dev/null', 'w') file = fd.askopenfilename() sys.stderr.close() sys.stderr = original_stderr print(file)
方法2:通过ctypes过滤特定Apple日志
利用系统CoreFoundation库精准屏蔽目标日志,不会影响其他错误输出:
import ctypes from tkinter import filedialog as fd # 加载CoreFoundation框架 cf = ctypes.CDLL('/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation') CFStringRef = ctypes.c_void_p # 构造要过滤的日志字符串 target_log = "+[CATransaction synchronize] called within transaction" cf_string = cf.CFStringCreateWithCString(None, target_log.encode('utf-8'), 0x08000100) # 设置日志过滤级别,屏蔽低于Warning级别的日志 cf.CFLogSetFilterLevel(2) file = fd.askopenfilename() # 释放资源 cf.CFRelease(cf_string) print(file)
方法3:全局修改Python日志配置
通过终端命令临时修改系统默认日志级别,重启后恢复:
# 屏蔽目标日志级别 defaults write com.apple.python LoggingLevel 3 # 恢复默认配置 defaults delete com.apple.python LoggingLevel
注意:方法1会屏蔽所有标准错误输出,若代码有其他需要监控的错误信息,谨慎使用;方法3是全局设置,会影响所有运行的Python程序。
内容的提问来源于stack exchange,提问作者Masked Idiot
相关产品推荐
相关产品推荐

