Search code examples
pythonscriptingradio-buttonmayapymel

(Maya Python) How do I run radio option buttons through a GUI function?


Normally when I run a script with radio button options you select a radio button option and then you activate it with the button. I used to leave my menu gui outside of a function: but ever since I learned importing maya scripts I started wrapping my menu interfaces in a GUI function which mean my radio button technique now no longer works. I have no idea how to get it to work either. The script itself is simple enough: just select a radio button option after importing the script and then create a shape with the button: atleast thats how it SHOULD work. Instead I get no errors and no shapes created and I dont know whats broken.

'''
import cubeTestTemp
reload (cubeTestTemp)
cubeTestTemp.gui()
'''

import maya.cmds as cmds

#Creates ui. 
if cmds.window("cubeWin", exists =True):
    cmds.deleteUI("cubeWin", window = True)

myWindow = cmds.window("cubeWin",t='DS shapeDemo V1',w=200, h=500, toolbox=True)
column = cmds.columnLayout(adj=True)
#Creates variable to indicate the check box status. 1=Checked 0=Not Checked. 

cubeNum1 = 0
cubeNum2 = 0


#Creates Button funtion. 
def defaultButtonPush(*args):
       #The Print checks if button is pushed and what is the check box status. 
       print "Button is pushed."
       print cubeNum1
       #Check box argument finds the status of the variable and determines what to do. 
       #Eather create a cube or display a error dialog box.
       if cubeNum1 == 1:
        print "Cube Creation sucessful"
        cmds.polyCube()

       print "Button is pushed."
       print cubeNum2
       if cubeNum2 == 1:
        print "Sphere Creation sucessful"
        cmds.polySphere()


def gui(*args):
    #Creates check box. 
    #In the onCommand Script (onc) and offCommand Script (ofc) flags all commands must be made in between double quotes.
    cmds.radioCollection()
    cmds.radioButton(label='Cube',align='left',onCommand="cubeNum1 = 1", offCommand="cubeNum1 = 0")
    cmds.radioButton(label='Sphere',align='left',onCommand="cubeNum2 = 1", offCommand="cubeNum2 = 0")
    #Creates Button.
    cmds.button( label='Execute', command=defaultButtonPush ,align='left' )

cmds.showWindow()

Solution

  • Here's the modified script. The problem was the scope of the scripts. "onCommand" was executed in its own scope that has its own "cubeNum" variables.

    """
    import cubeTestTemp
    reload (cubeTestTemp)
    cubeTestTemp.gui()
    """
    
    import maya.cmds as cmds
    
    # Variable to indicate the radio button status. 1=Cube, 2=Shpere. 
    shape_selector = 0
    
    
    def action_button(*args):
        """
        Create an object based on the shape_selector status
        """
        print "Button is pushed", repr(args)
        if shape_selector == 1:
            cmds.polyCube()
            print "Cube created"
        elif shape_selector == 2:
            cmds.polySphere()
            print "Sphere created"
        else:
            print "No shape selected"
    
    
    def selection_changed(shape):
        """
        Save the current shape selection
        into global variable "shape_selector"
        """
        global shape_selector
        shape_selector = shape
        print "Current selection:", shape_selector
    
    
    def gui():
        """
        Create the GUI
        """
        if cmds.window("cubeWin", exists=True):
            cmds.deleteUI("cubeWin", window=True)
        myWindow = cmds.window("cubeWin", t='DS shapeDemo V1', w=200, h=500, toolbox=True)
        column = cmds.columnLayout(adj=True)
        # Create the radio buttons 
        cmds.radioCollection()
        cmds.radioButton(label='Cube',align='left', select=True, onCommand=lambda x:selection_changed(1))
        cmds.radioButton(label='Sphere',align='left', onCommand=lambda x:selection_changed(2))
        # Create the push button
        cmds.button(label='Create', command=action_button, align='left')
        cmds.showWindow()
    
    if __name__ == "__main__":
        gui()
    

    Another way is to read the radio button state only when needed

    """
    import cubeTestTemp
    reload (cubeTestTemp)
    cubeTestTemp.gui()
    """
    
    import maya.cmds as cmds
    
    
    def action_button(cube_button, sphere_button):
        """
        Create an object based on the shape_selector status
        """
        if cmds.radioButton(cube_button, query=True,select=True):
            cmds.polyCube()
            print "Cube created"
        elif cmds.radioButton(sphere_button, query=True,select=True):
            cmds.polySphere()
            print "Sphere created"
        else:
            print "No shape selected"
    
    
    def gui():
        """
        Create the GUI
        """
        if cmds.window("cubeWin", exists=True):
            cmds.deleteUI("cubeWin", window=True)
        myWindow = cmds.window("cubeWin", t='DS shapeDemo V1', w=200, h=500, toolbox=True)
        column = cmds.columnLayout(adj=True)
        # Create the radio buttons 
        cmds.radioCollection()
        # Save the button ids
        cube_button = cmds.radioButton(label='Cube',align='left', select=True)
        sphere_button = cmds.radioButton(label='Sphere',align='left')
        # Create the push button
        cmds.button(label='Create', command=lambda x:action_button(cube_button, sphere_button), align='left')
        cmds.showWindow()
    
    if __name__ == "__main__":
        gui()