2016-10-11 4 views
1

私はMaya Pythonで書いたこのスクリプトにいくつか問題があります。ボタンを押すことでUIを閉じる関数を呼び出せます。私はここと他のサイトの両方を見回しました。私はそれを機能させるように見えません。 「閉じる」ボタンを押しても何も起こりません。deleteUIがMaya Pythonでこのスクリプトで動作しないのはなぜですか?

def closeUI(*args): 

    if (cmds.window('mainWindow', exists=True)): 
     cmds.deleteUI('mainWindow') 


def mainWindow(*args): 

    closeUI() 

    mainWindow = cmds.window(title="Auto-rig", widthHeight=(300, 300), s=False, vis=True, toolbox=True) 
    cmds.columnLayout(adjustableColumn=True) 

    cmds.button(label='Create Joints (1 of 3)', command=createJoints, en=True) 

    cmds.button(label='Create IK (2 of 3)', command=createIk, en=True) 

    cmds.button(label='Create Controls (3 of 3)', command=createControls, en=True) 

    cmds.button(label='Close', command=closeUI, en=True) 

mainWindow() 

答えて

0
def del_win(win_id, *args) 
    if cmds.window(win_id, query=True, exists=True): 
     # add type of UI element, window, layout, control 
     cmds.deleteUI(win_id, window=True) 
window = cmds.window("main_win", title="Auto-rig") 

del_win("main_win") 

または

del_win(window) 

戻ってあなたのコードに

from functools import partial 
def closeUI(win_id, *args): 
    if (cmds.window(win_id, exists=True)): 
     cmds.deleteUI(win_id, window=True) 

def main_Window(*args): 

    cmds.window("mainWindow", title="Auto-rig", widthHeight=(300, 300), s=False, vis=True, toolbox=True) 
    cmds.columnLayout(adjustableColumn=True) 
    cmds.button(label='Create Joints (1 of 3)', command=createJoints, en=True) 
    cmds.button(label='Create IK (2 of 3)', command=createIk, en=True) 
    cmds.button(label='Create Controls (3 of 3)', command=createControls, en=True) 
    cmds.button(label='Close', command=partial(closeUI, "mainWindow"), en=True) 
    cmds.showWindow("mainWindow") 
main_Window() 
+0

コードをチェックしましたか?それはまったく動作していません... – andy

+0

存在しない関数を呼び出すボタンコマンドを単に削除すると、コードが機能します。実際にはその質問に答えます。 – UKDP

1

HEREはMAYA PYTHON SCRIPTを進めています。

enter image description here

あなたは、現在のスクリプトのdef main_Window(*args)を使用しないでください。

import maya.cmds as maya 

def createJoints(*args): 
    print 'createJoints button was pushed.' 

def createIk(*args): 
    print 'createIK button was pushed.' 

def createControls(*args): 
    print 'createControls button was pushed.' 

def closeWindow(*args):  
    print 'mayaWindow was closed.' 

    if (maya.window(mayaWindow, exists=True)): 
    maya.deleteUI(mayaWindow, control=True) 

mayaWindow = maya.window(title="Auto-rig", widthHeight=(300, 300), s=False, vis=True, toolbox=True) 
maya.columnLayout(adjustableColumn=True) 
maya.button(label='Create Joints...(1 of 3)', command=createJoints, en=True) 
maya.button(label='Create IK...(2 of 3)', command=createIk, en=True) 
maya.button(label='Create Controls...(3 of 3)', command=createControls, en=True) 
maya.button(label='Close', command=closeWindow, en=True) 
maya.showWindow(mayaWindow) 
2

Maya guiウィジェットへの文字列参照に注意する必要があります。要求された名前を取得することは保証されません。したがって、たとえあなたのコードが "X"という名前のウィンドウを作成しようとしても、 "X1"と呼ばれるウィンドウが表示され、参照がハードコードされていれば "X1"は決して見つかりません。

正しい方法この場合は、作成時に変数のウィンドウの名前を取得し、その名前を使用します。これは、関数が宣言時に存在していた変数の値を '取得'できるようにするPythonの機能です。あなたは、メインウィンドウの実際のidは単に「CREATE_WINDOW」の結果を格納し、何であるか覚えておきたい場合は

import maya.cmds as cmds 

def create_window(): 
    window = cmds.window(title='Main Window') 
    column = cmds.columnLayout() 
    button = cmds.button("Delete me") 

    def close_handler(*_): 
     cmds.deleteUI(window) # 'window' is captured by the closure 

    cmds.button(button, e=True, command = close_handler) 

    cmds.showWindow(window) 
    return window 

create_window() 

:ここにクロージャを使用して、ウィンドウのIDを無視し、非常に基本的な例で、です。ハードコーディングされたUIアイテムの適切なパス名を常に知っていることを確認することにかかわる面倒を考えると、あまり面倒な価値はほとんどありません。

あなたのUIのビットと部分の間の他の種類のコミュニケーションに対処するために、クロージャの使用を拡張することができます。ほとんどの場合、ハードコードされた文字列ですべてを管理しようとするよりも簡単で、バグの傾向がありません。

+0

ありがとう!これは間違いなく助けになります! – RasmusJBjork

関連する問題