Hello there.

This is what I'd like to achieve: let's say I have a script that I saved as 
testScript.py, and it is located in the scripts folder, so that Maya can 
find it. I want to add an icon to my custom shelf which, instead of running 
the code of script, "loads" the script file and runs it. This would allow 
me to edit the script and avoid substituting the code inside the custom 
shelf icon.
Here is a code example:
# Load maya commands module
import maya.cmds as mc

# This prevents multiple windows to pop up
if mc.window("myWindow", ex=True):
    mc.deleteUI("myWindow", window=True)

# Window set-up
mc.window("myWindow",title="Test Window", s=False, wh=(300,100))
mc.columnLayout(adj=True)
toggle_test = mc.checkBox(label = 'Toggle me!', value = False)
mc.button(l="Press to print the value of the checkbox below", w=300, h=100,
          command = 'printIt()'
          )
mc.showWindow("myWindow")    
    

# Print the value
def printIt():    
    
    # Query toggle status
    var = mc.checkBox(toggle_test, query = True, value = True )
    
    # Print the status
    print "Checkbox's status is:", var

The code runs fine if selected and executed in the script editor. I created 
a shelf button with the following code:
import testScript

reload (testScript)

After restarting maya, or deleting the global instance of the printIt 
function, if I click on the shelf button the script runs and the UI is 
shown. If I then click on the UI button, I get the following error:

# Error: NameError: file <maya console> line 1: name 'printIt' is not 
defined #

Ok, I get what is happening. The button press is running the code 
'printIt()', but the function has not been imported in global space (I 
might be throwing wrong terms around a bit, please correct me if that 
happens) and it can't be found.

I am willing to edit the script, but I want it to work both by importing it 
or running it from the script editor. First option is to edit the shelf 
button code to:
from testScript_01 import *

import testScript

reload (testScript)

This seems to work fine, but as I understand is not the suggested way of 
solving the problem.

I could also edit 
command = 'printIt()'
to
command = 'testScript.printIt()'

but this would have to side effects: first, if the script file is renamed 
or imported as something else, the function would not work anymore. Second, 
running the code inside the script editor would not work anymore.

So, any idea on how I could fix this issue? Is there a way I could feed the 
proper filename to the code?

Something like:

import testScript

reload (testScript)
# Add a line of code that feeds the string 'testScript' to the imported 
module
that then could be used inside the script as:
# Declare var for fed string

input_string = #fed string

...

command = input_string + '.printIt()'

Hopefully I managed to explain the issue properly :P

Thanks in advance!

-- 
You received this message because you are subscribed to the Google Groups 
"Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/python_inside_maya/be3c13c1-48f0-41d3-8184-e36fda61073e%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to