Вызов метода другим методом в другом классе (вызов Method_B ​​внутри Class_B, с Method_A внутри Class_A) - PullRequest
1 голос
/ 02 августа 2020

Я использую Maya и в настоящее время пишу Auto-Rig. Я создал разные классы для каждой основной задачи инструмента. (например: Class_UI, Class_Arms_Rig, et c ..)

У меня проблема в том, что я не могу вызвать метод из Class_Joints (класс, который будет генерировать все необходимые соединения) с моим " Class_UI "

Вот коды:

Сначала Class_UI

import sys
sys.path.append('G:\\3D2\\Script\\Auto_Rig')

import Class_Joints
import Class_Arms

import maya.cmds as mc

class Window_UI(object):

# Initializing global variables
def __init__(self):
    
    # Getting acces to the different modules
    self.Arms = Class_Arms.Arms_Rig()
    self.Joints = Class_Joints.Gen_Joints()

    # Create Ui
    self.create_UI()

# Creating the UI
def create_UI(self):
    # Create window
    self.UI = mc.window(title='Auto-Rig Tool', w=(300), h=(350))

    # Main layout
    self.mainLayout = mc.menuBarLayout()

    ### Joints Option ###
    # Create Joints Button
    self.createJointsButton = mc.button(label='Create Joints', command=self.Joints.gen_arms_joints)
    
Window_UI()
mc.showWindow()

Затем Class_Joints:

import maya.cmds as mc

class Gen_Joints:

# Creating arm Jnts and the list of it
def gen_arms_joints(self):
    
    self.shoulderJnt = mc.joint(absolute=True, position=[5,8,0], n='L_Shoulder_Jnt')
    self.elbowJnt = mc.joint(absolute=True, position=[10,8,-1.5], n='L_Elbow_Jnt')
    self.wristJnt = mc.joint(absolute=True, position=[15,8,0], n='L_Wrist_Jnt')
    self.handcupJnt = mc.joint(absolute=True, position=[18,8,0], n='L_HandCup_Jnt')

    self.jntList = mc.ls(self.shoulderJnt, self.elbowJnt, self.wristJnt, self.handcupJnt)

Когда я запускаю Class_UI Код, кнопка в пользовательском интерфейсе должна запускать метод gen_arms_joints в Class_Joints

Но я получаю это сообщение об ошибке: # Error: gen_arms_joints() takes exactly 1 argument (2 given) #

Я знаю, что self - это здесь неявный аргумент, но я не знаю, как избежать этой ошибки.

Всем спасибо за ваше время. : D

С уважением, Лука.

Ответы [ 4 ]

1 голос
/ 02 августа 2020

Я бы порекомендовал вам сделать две вещи. Я не использую Maya, но я создал приложения с несколькими различными графическими интерфейсами.

  1. Каждый GUI, который я использовал, когда дело доходит до кнопок, первый аргумент - это ссылка на себя, а затем обычно передаются еще 1 или 2 аргумента. Некоторые передают ссылку на саму кнопку, а другие передают аргумент, содержащий сведения о событии. Думаю, вот что происходит. Когда вы нажимаете кнопку, он передает объект «событие», содержащий подробную информацию о том, что было нажато, и другие сведения.

  2. Чтобы действительно узнать, что передается, измените подпись вашей функции на это и посмотрите, что записано.

def gen_arms_joints(self, mystery_second_arg):
    print(type(mystery_second_arg), mystery_second_arg)

    self.shoulderJnt = mc.joint(absolute=True, position=[5,8,0], n='L_Shoulder_Jnt')
    self.elbowJnt = mc.joint(absolute=True, position=[10,8,-1.5], n='L_Elbow_Jnt')
    self.wristJnt = mc.joint(absolute=True, position=[15,8,0], n='L_Wrist_Jnt')
    self.handcupJnt = mc.joint(absolute=True, position=[18,8,0], n='L_HandCup_Jnt')
    self.jntList = mc.ls(self.shoulderJnt, self.elbowJnt, self.wristJnt, self.handcupJnt)
0 голосов
/ 06 августа 2020

mc.button передает дополнительное значение boolean методу, поэтому, поскольку оно не определено в gen_arms_joints, он выдает эту ошибку и сообщает, что это неправильное количество аргументов.

Так что просто добавьте дополнительный параметр, и он исправит это: def gen_arms_joints(self, extra_param):

Или, еще лучше, используйте *args, чтобы быть немного более универсальным c: def gen_arms_joints(self, *args):

Это, честно говоря, подло потому что это на самом деле не указано в документации, но вы можете увидеть, что он используется в примере внизу страницы .

0 голосов
/ 02 августа 2020

@ FishingCode

Посмотрите, что я пробовал, основываясь на том, что вы мне сказали:

import sys
sys.path.append('G:\\3D2\\Script\\Auto_Rig')

import Class_Joints
import Class_Arms

import maya.cmds as mc

class Window_UI(object):

    # Initializing global variables
    def __init__(self):
    
        # Getting acces to the different modules
        self.Arms = Class_Arms.Arms_Rig()
        self.Joints = Gen_Joints()

        # Create Ui
        self.create_UI()

    # Creating the UI
    def create_UI(self):
        # Create window
        self.UI = mc.window(title='Auto-Rig Tool', w=(300), h=(350))

        # Main layout
        self.mainLayout = mc.menuBarLayout()

        # Create Joints Button
        self.createJointsButton = mc.button(label='Create Joints', command=self.Joints.gen_arms_joints)

#show window
Window_UI()
mc.showWindow()

Это именно то, что у меня есть в Visual Studio Code

    import maya.cmds as mc

class Gen_Joints:

    # Creating arm Jnts and the list of it
    def gen_arms_joints(self):
        
        self.shoulderJnt = mc.joint(absolute=True, position=[5,8,0], n='L_Shoulder_Jnt')
        self.elbowJnt = mc.joint(absolute=True, position=[10,8,-1.5], n='L_Elbow_Jnt')
        self.wristJnt = mc.joint(absolute=True, position=[15,8,0], n='L_Wrist_Jnt')
        self.handcupJnt = mc.joint(absolute=True, position=[18,8,0], n='L_HandCup_Jnt')

        self.jntList = mc.ls(self.shoulderJnt, self.elbowJnt, self.wristJnt, self.handcupJnt) 

Код VS сообщает мне Undefined variable 'Gen_Joints' И в Maya я получаю # Error: NameError: file <maya console> line 16: global name 'Gen_Joints' is not defined #

0 голосов
/ 02 августа 2020

Проблема в том, что в вызове __init__() из Class_UI вы определили неправильный вызов класса для фактической функции gen_arm_joints(self), это должно быть: self.Joints = Gen_Joints(), похоже, у вас другой import classNames но в коде вы назвали класс Gen_Joints. Вы не можете передать две ссылки на классы self, т.е. обратную трассировку ошибок.

Вам нужно будет исправить класс import на import Gen_Joints.

...