PDA

View Full Version : error on loading function external to class from function inside class


DEVILSAN
09-15-2012, 08:19 AM
have a look at the code,

import maya.cmds as cmds
dic={}
print("dictionary is empty",dic)
def main():
inst=btnUI()
inst.create()


class btnUI(object):
def __init__(self, winName="winTheWindow"):
self.winTitle = "The Window"
self.winName = winName

def create(self):
if cmds.window(self.winName, exists=True):
cmds.deleteUI(self.winName)
dic['item1']='item1value'
dic['item2']='item2value'

cmds.window(self.winName, title=self.winTitle)
self.mainCol = cmds.columnLayout( adjustableColumn=True )
self.btnA = cmds.button( label='Press Me - External Func',c='outsideFunc(dic)' )
self.btnb = cmds.button( label='Populate more items',c='populateDic()' )
cmds.showWindow( self.winName )
cmds.window(self.winName, edit=True, widthHeight=[250,75])



def populateDic():
dic['item3']='item3value'
dic['item4']='item4value'
dic['item5']='item5value'

def outsideFunc(dicItems):
print("Outside function, called from inside a class function")
print(dicItems)

if __name__ == '__main__':
main()
all i am trying is to add more items to dictionary and populate with second button if necessary!!! everything goes fine, if i have this code in script editor and I run it clicking on the blue play button but if i import this script
import funtest
funtest.main()

the window loads up but i get error on clicking the button... So please tell me why is their a difference between executing the code from script editor and the other one by importing..

it shouild be same or if it is what is wrong with my logic ?

ThE_JacO
09-17-2012, 03:47 AM
When you run it inside the script, that function is registered to the running main, and can be called by its name, because it will be topmost and has no namespace.

When you import the module, that function called the way you do isn't registered anywhere, so it can't be found, because its namespace would become:
importedModuleName.whateverFunction()

It's rather basic Python internals you really want to familiarise yourself with if you want to approach OOP in Python.

And any reason to not make it a method of that class anyway?
At the very least you will need to register it as a maya command if you don't want to embed it in the class as a method, so it shows up and can be called.

DEVILSAN
09-17-2012, 04:15 AM
And any reason to not make it a method of that class anyway?
At the very least you will need to register it as a maya command if you don't want to embed it in the class as a method, so it shows up and can be called. yes I also want the script to run in non-gui mode by passing command line however I haven't implemented that yet..

DEVILSAN
09-17-2012, 04:18 AM
When you run it inside the script, that function is registered to the running main, and can be called by its name, because it will be topmost and has no namespace.

When you import the module, that function called the way you do isn't registered anywhere, so it can't be found, because its namespace would become:
importedModuleName.whateverFunction()

So you mean , I would have to put the code that creates GUI outside the main block ? is it this how all python scripts for Maya are done ?

ThE_JacO
09-17-2012, 01:02 PM
What I mean is that from inside your class, you are invoking a command.
When you run with your script as __main__ and that also contains the class, it will look for the command you told it to run in there as well, find it, because it's in an available namespace, and run it.

However, when you import as a module, that command is not in the __main__ anymore, and will not be found.

If you want to run commands both from a GUI and from a batch process, or if anything is generic enough that it warrants existing decoupled from the guy, you should implement it, and then register it, as a command on its own, so that it can comfortably be called from anywhere.

Relying on a specific scope, especially one as usually unavailable as the script editor, is going to be pain through and through.

CGTalk Moderation
09-17-2012, 01:02 PM
This thread has been automatically closed as it remained inactive for 12 months. If you wish to continue the discussion, please create a new thread in the appropriate forum.