【问题标题】:Python for Maya - Slider color changerPython for Maya - 滑块换色器
【发布时间】:2020-06-15 04:14:52
【问题描述】:

我用 Python 为 Maya 编写了这个小脚本,其中有一个滑块可以更改 iconTextButton 的背景颜色。运行脚本我没有任何警告或错误,但它并没有按照我上面的解释进行。

我不知道是什么问题,也许是我试图在另一个函数中调用一个函数? (当我在s_off() 中调用 setColor() 时)。如果问题是这样,我该如何解决?

代码如下:

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()

【问题讨论】:

    标签: python user-interface maya mel


    【解决方案1】:

    所以两件事:

    • 你错过了使用类,你应该使用自我。当某些东西在你的用户界面内的其他地方使用时,例如:窗口名称、滑块、彩色按钮
    • 您在设置颜色之前输入了一个 return,所以它会退出

    /

    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()
    

    【讨论】:

    • 当除 modelEditor 以外的任何其他面板被聚焦时,这将失败(如果 scriptEditor 被聚焦,则不起作用!)。
    • 我认为 modelEditor 是他脚本中其他内容的一部分
    【解决方案2】:

    你几乎已经完成了,只是一些笔记:

    1. 创建 gui 对象时,不要忘记将它们捕获为变量并使用 self 以便以后可以引用它们。
    2. 在你的类中,所有方法的第一个参数都应该是self,除非你特意让它成为一个静态方法(然后你需要添加装饰器)。如果您想了解更多信息,请使用 Google 快速搜索。
    3. 无需在setColor 中查询滑块的当前值,因为它的changeCommand 已经在其参数中提供了它。
    4. 不太清楚s_offs_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()
    

    【讨论】:

    • 我不知道 maya ui ctrl 正在发出它们的值:O
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-08
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多