Python для Maya - ползунок смены цвета - PullRequest
0 голосов
/ 02 марта 2020

Я написал этот маленький скрипт в Python для Maya, где у меня есть ползунок, который должен изменить цвет фона моего iconTextButton. При запуске скрипта у меня нет никаких предупреждений или ошибок, но он не выполняет то, что я объяснил выше.

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

Вот код:

import maya.cmds as cmds
from functools import partial

class ColorChangeWin(object):
    def __init__(self):
        self.buildWin()

    def buildWin(self):
        self.win = cmds.window(title="ColorChange")
        self.menuLayout = cmds.menuBarLayout()
        self.menu = cmds.menu(label="Window")
        self.menuItem = cmds.menuItem(label = "Close", command = partial(self.closeWin, self.win))
        self.mainlayout = cmds.columnLayout(adj = True)
        color = cmds.intSlider(min = 0, max = 3, value = 0,  step = 1, dc = partial(self.s_off), cc = partial(self.s_on), p = self.mainlayout)
        cmds.iconTextButton(w = 55, bgc = (0.467, 0.467, 0.467), p = self.mainlayout)
        cmds.showWindow(self.win)

    def closeWin(self, window = None, arg = None):
        if cmds.window(self.win, exists = True):
            cmds.deleteUI(self.win, window = True)


    def s_off(*args):
        panel = cmds.getPanel(withFocus=True)
        cmds.modelEditor(panel, e = True,  sel = False, m = False)
        return()
        setColor()

    def s_on(*args):
        panel = cmds.getPanel(withFocus=True)
        cmds.modelEditor(panel, e = True, sel = True, m = True)

    def setColor(*args):
        color_1 = cmds.intSlider(color, q = True, value = True)

        if color_1 == 0: 
            cmds.iconTextButton(e = True, bgc = (1, 1, 1))
        if color_1 == 1:
            cmds.iconTextButton(e = True, bgc = (0, 0, 1))
        if color_1 == 2:
            cmds.iconTextButton(e = True, bgc = (0.608, 0, 0.157))
        return 

ColorChangeWin()

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

У вас почти это было, всего несколько заметок:

  1. Когда вы создаете gui объекты, не забудьте захватить их как переменную и использовать self, чтобы вы могли сошлемся на них позже.
  2. В вашем классе все первый параметр метода должен быть self, если только вы не намеренно делаете его методом stati c (тогда вам нужно добавить декоратор). Если вы хотите узнать больше, выполните быстрый поиск в Google.
  3. Нет необходимости запрашивать текущее значение ползунка в setColor, поскольку его changeCommand уже предоставляет его в своем аргументе.
  4. Не слишком уверен, что достигнуто в s_off и s_on. Поскольку все элементы интерфейса были сохранены с self., вы уже можете ссылаться на них из любого другого метода в классе.

Вот рабочий пример:

import maya.cmds as cmds
from functools import partial


class ColorChangeWin(object):

    def __init__(self):
        self.buildWin()

    def buildWin(self):
        self.win = cmds.window(title="ColorChange")
        self.menuLayout = cmds.menuBarLayout()
        self.menu = cmds.menu(label="Window")
        self.menuItem = cmds.menuItem(label="Close", command=partial(self.closeWin, self.win))
        self.mainlayout = cmds.columnLayout(adj=True)
        self.color = cmds.intSlider(min=0, max=2, value=0, step=1, cc=partial(self.setColor), p=self.mainlayout)  # Add self.
        self.textButton = cmds.iconTextButton(w=55, bgc=(0.467, 0.467, 0.467), p=self.mainlayout)  # Capture in variable.
        cmds.showWindow(self.win)

    def closeWin(self, window=None, arg=None):
        if cmds.window(self.win, exists=True):
            cmds.deleteUI(self.win, window=True)

    def setColor(self, color_1):  # Add self as first parameter. No need to query the slider's value, as the 2nd parameter already has it from its changeCommand.
        if color_1 == 0: 
            cmds.iconTextButton(self.textButton, e=True, bgc=(1, 1, 1))
        if color_1 == 1:
            cmds.iconTextButton(self.textButton, e=True, bgc=(0, 0, 1))
        if color_1 == 2:
            cmds.iconTextButton(self.textButton, e=True, bgc=(0.608, 0, 0.157))


ColorChangeWin()
0 голосов
/ 03 марта 2020

Итак, две вещи:

  • вы скучаете по классам, вы должны использовать себя. когда что-то используется где-то еще внутри вашего пользовательского интерфейса как ie: имя окна, ползунок, цветная кнопка
  • , вы вводите возврат, прежде чем установить цвет, чтобы он выходил

/

from functools import partial
import maya.cmds as cmds

class ColorChangeWin(object):
    def __init__(self):
        self.buildWin()

    def buildWin(self):
        self.win = cmds.window(title="ColorChange")
        cmds.menuBarLayout()
        menu = cmds.menu(label="Window")
        cmds.menuItem(label = "Close", command = partial(self.closeWin, self.win))
        main_layout = cmds.columnLayout(adj = True)
        self.color = cmds.intSlider(min = 0, max = 3, value = 0,  step = 1, dc = partial(self.s_off), cc = partial(self.s_on), p = main_layout)
        self.text_button = cmds.iconTextButton(w = 55, bgc = (0.467, 0.467, 0.467), p = main_layout)
        cmds.showWindow(self.win)

    def closeWin(self, window = None, arg = None):
        if cmds.window(self.win, exists = True):
            cmds.deleteUI(self.win, window = True)


    def s_off(self, *args):
        panel = cmds.getPanel(withFocus=True)
        cmds.modelEditor(panel, e = True,  sel = False, m = False)
        self.setColor()
        return

    def s_on(self, *args):
        panel = cmds.getPanel(withFocus=True)
        cmds.modelEditor(panel, e = True, sel = True, m = True)

    def setColor(self):
        color_1 = cmds.intSlider(self.color, q = True, value = True)

        if color_1 == 0: 
            cmds.iconTextButton(self.text_button, e = True, bgc = (1, 1, 1))
        if color_1 == 1:
            cmds.iconTextButton(self.text_button, e = True, bgc = (0, 0, 1))
        if color_1 == 2:
            cmds.iconTextButton(self.text_button, e = True, bgc = (0.608, 0, 0.157))
        return
ColorChangeWin()
...