Кодировка текста между файлом Python, редактором сценариев Maya и пользовательским интерфейсом Maya (Python 2.7, Maya 2015, Windows 7) - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть файл python, который я загружаю как скрипт в редактор скриптов maya.Файл Python в настоящее время закодирован как UTF-8.

У меня есть необходимость использовать символы ↑ и ↓ (или любые другие замены стрелок в Юникоде, такие как ➘ или ➚, я просто хочу передать ивниз).Я использую символы в качестве метки кнопки.Вот сценарий:

import Maya.cmds as cmds

def initInterface():
    cmds.window("mywin")
    cmds.rowColumnLayout("my_rcl", nc=1)
    cmds.button(label=u'\↑')
    cmds.button(label=u'\↓')
    cmds.showWindow("mywin")

initInterface()

Этот сценарий сохраняется как myPythonScript.py и затем загружается в редактор сценариев Maya с помощью кнопки загрузки сценария.

При выполнении я получаю окно пользовательского интерфейсаи кнопки, как и ожидалось, но метки для кнопок теперь "?"(вопросительные знаки).Кажется, я не могу заставить Майю отображать стрелки.

Чтобы решить эту проблему, я попробовал пару вещей в коде.Вот несколько моих попыток:

# Attempt 1
upArrow = u'\↑'
upArrowEncoded = upArrow.encode("utf-8")
cmds.button(label=upArrowEncoded)
# Result: "?"

# Attempt 2
upArrow = u'\U+2B06'
cmds.button(label=upArrow)
# Result: "?B06"

# Attempt 3
upArrow = u'\U+2B06'
upArrowEncoded = upArrow.encode("utf-8")
cmds.button(label=upArrowEncoded)
# Result: "?"

Честно говоря (и это может быть очевидно из моих фрагментов кода), я никогда не экспериментировал с кодировкой текста и почти ничего не знаю об этом.Я не уверен, нужно ли мне изменить кодировку моего файла .py или кодировать строку с помощью UTF-16 или чего-то еще.Это выходит за рамки моей компетенции, и мне трудно найти ресурсы, которые помогут мне понять текстовое и строковое кодирование.

Я проверил это: Юникод в Maya

И это: Преобразование строки Юникода в строку в Python, содержащей дополнительные символы

Но я не смог понять многое из того, что я прочитал, и я не уверен, относятся ли они к этой проблеме или нет.

Я из тех людей, которым не нравится использовать код, который я не понимаю (как люди даже документируют это?), Поэтому я здесь, чтобы попросить ссылки на учебные ресурсы и на общие сведения.совет по этому вопросу, более того, чем фрагмент кода, который делает то, что я хочу.Если оказывается, что это невозможно, я могу вместо этого использовать кнопки изображений.Но они менее эффективны и отнимают много времени для каждого специального символа, который я могу использовать.

Спасибо, что прочитали это, и заранее спасибо всем, кто может указать мне правильное направление здесь.Ура!

1 Ответ

0 голосов
/ 20 декабря 2018

Насколько я могу судить, нативный MayaUi использует / имеет доступ к кодовой странице 1252 Windows Latin 1 (ANSI) (хотя бы в Windows ...), как упомянуто здесь , и после некоторой лапши все эти * работают, как рекламируется.

Мне было бы любопытно увидеть ответ, объясняющий, как это изменить и получить доступ к тому, что ищет OP, но в качествеВ качестве альтернативы любому, кто действительно хочет больше специальных символов, могу я предложить изучить PySide / Qt для создания вашего пользовательского интерфейса.

Предостережения

  1. Намного больше шаблонов инастройка, когда дело доходит до создания «чего-то простого» * ​​1014 *
  2. Некоторые mayaControls не имеют прямых реализаций Qt ( градиентControlNoAttr является недавним открытием и показательным примером)
  3. Примернаписано в предположении, что пользователь установил и использует Qt.py

Позволяет погрузиться прямо в:

import maya.cmds as cmds
import maya.OpenMayaUI as omui
from Qt import QtCore, QtGui
from Qt.QtWidgets import *
from shiboken import wrapInstance

def maya_main_window():
    main_window_ptr = omui.MQtUtil.mainWindow()
    return wrapInstance(long(main_window_ptr), QWidget)

class TestUi(QDialog):
    def __init__(self, parent=maya_main_window()):
        super(TestUi, self).__init__(parent)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

    def create(self):
        self.setWindowTitle("TestUi : Unicode")
        self.setWindowFlags(QtCore.Qt.Tool)

        self.create_controls()
        self.create_layout()
        self.create_connections()

    def create_controls(self):
        """
        Create the widgets for the dialog.
        """
        # using "Python source code" unicode values
        # ie: https://www.fileformat.info/info/unicode/char/2191/index.htm
        self.up_button = QPushButton(u'\u2191')
        self.down_button = QPushButton(u'\u2193')
        self.left_button = QPushButton(u'\u2190')
        self.right_button = QPushButton(u'\u2192')

    def create_layout(self):
        """
        Create the layouts & add widgets
        """
        main_layout = QVBoxLayout()
        main_layout.setContentsMargins(6, 6, 6, 6)

        main_layout.addWidget(self.up_button)
        main_layout.addWidget(self.down_button)
        main_layout.addWidget(self.left_button)
        main_layout.addWidget(self.right_button)

        main_layout.addStretch()
        self.setLayout(main_layout)


    def create_connections(self):
        """
        Create the signal/slot connections
        """
        self.up_button.clicked.connect(self.on_button_pressed)
        self.down_button.clicked.connect(self.on_button_pressed)
        self.left_button.clicked.connect(self.on_button_pressed)
        self.right_button.clicked.connect(self.on_button_pressed)

    def on_button_pressed(self):
        print "Button Pressed"

def LaunchUI():
    if __name__ == "__main__":
        # Development workaround for PySide winEvent error (Maya 2014)
        # Make sure the UI is deleted before recreating
        try:
            test_ui.deleteLater()
            test_ui.close()
        except:
            pass
         # Create minimal UI object
        test_ui = TestUi()
        # Delete the UI if errors occur to avoid causing winEvent
        # and event errors (in Maya 2014)
        try:
            test_ui.create()
            test_ui.show()
        except:
            test_ui.deleteLater()
            traceback.print_exc()
LaunchUI()

Там очень много распаковать дляне ужасноОгромная отдача, но соответствующая часть информации живет под "create_controls".

demonstration of unicode in Maya UI via PySide

...