自定义 Maya 的脚本编辑器字体

Customize Maya's script editor font

在 Maya 2019 之前,我使用以下脚本来自定义脚本编辑器字体。

from PySide2 import QtGui, QtCore, QtWidgets

def set_font(font='Courier New', size=12):
    """
    Sets the style sheet of Maya's script Editor
    """
    
    # Find the script editor widget
    app = QtWidgets.QApplication.instance()
    win = next(w for w in app.topLevelWidgets() if w.objectName()=='MayaWindow')

    # Add a custom property
    win.setProperty('maya_ui', 'scriptEditor')

    # Apply style sheet
    styleSheet = '''
    QWidget[maya_ui="scriptEditor"] QTextEdit {
      font-family: %s;
      font: normal %spx;
    }
    ''' %(font, size)

    app.setStyleSheet(styleSheet)
    

有了这个,我可以在所有选项卡上统一更改脚本编辑器的字体样式和大小。

# this is my current favorite
set_font(font='Consolas', size=20) 

在 Maya 2018 和 2019 中,这工作正常。我没有测试过2020,但是在2022和2023它执行没有错误但是没有按照需要改变界面。

问题

自 2019 年以来导致此脚本失败的更改。任何关于如何使这个脚本工作的提示将不胜感激。否则,当我发现问题时,我会post在这里提供解决方案。

我没有完整的答案,但以下似乎可行。一个值得注意的变化是 QTextEdit 似乎已替换为 QPlainTextEdit,但仅替换并不能解决问题。

但是,以下说明适用于 2022 年之前和之后的 Maya 版本,并且似乎有效。

import maya.cmds as cmds
from PySide2 import QtGui, QtCore, QtWidgets


def set_font(font='Courier New', size=12):
    """
    Sets the style sheet of Maya's script Editor
    """
    
    app = QtWidgets.QApplication.instance()
    win = None
    
    for w in app.topLevelWidgets():
        if "Script Editor" in w.windowTitle():
            win = w
            break
            
    if win is None:
        return
    
    # for Maya 2022 and above
    if int(cmds.about(version=True)) >= 2022:
        style = '''
            QPlainTextEdit {
                font-family: %s;
                font: normal %dpx;
            }
            ''' % (font, size)
        
        win.setStyleSheet(style)

    # for Maya 2020 and older
    else:
        style = '''
            QWidget[maya_ui="scriptEditor"] QTextEdit {
                font-family: %s;
                font: normal %dpx;
            }
            ''' % (font, size)
        
        win.setProperty('maya_ui', 'scriptEditor')
        app.setStyleSheet(style)
    
    
set_font(font='Consolas', size=20)