2016-05-05 41 views
-1

我已經在maya中使用python構建了一個小程序,並且我感興趣的是打印用戶在點擊'Apply'時輸入的值。關於如何實現這一點的任何想法?然後我想使用另一段代碼中的值在maya中創建建築物。回調maya UI內的用戶輸入值

def runGrid(): 
if mc.window('windowTest9', ex=True): 
    mc.deleteUI('windowTest9', window=True) 

mc.window('windowTest9', title='BuilGen', sizeable=False, resizeToFitChildren=True) 

mc.rowColumnLayout(numberOfColumns = 2, columnWidth = [ (1, 150), (2, 100), (3, 75)]) 

#mc.text(label = 'Top Bar') 
mc.separator(h = 10, style = 'none') 
mc.separator(h = 10, style = 'none') 

mc.text(label='Create a New Building', align = 'left') 
mc.image(image='F:\Photos\office-building-icon-687152.png') 


# insert a blank line space 
mc.separator(h = 10, style = 'singleDash') 
mc.separator(h = 10, style = 'singleDash') 


mc.text(label = 'number of sections wide:', align = 'left') 
buildingWidth = mc.intField(value = 4) 


mc.text(label = 'number of sections deep:', align = 'left') 
buildingDepth = mc.intField(value = 3)  

mc.text(label = 'number of floors:', align = 'left') 
numberOfFloors = mc.intField(value = 2)  


mc.text(label = 'roof:', align = 'left') 
numberOfFloors = mc.checkBox (label='Y/N')  
mc.separator(h = 10, style = 'none') 

# insert another blank line 
mc.separator(h = 10, style = 'none') 
mc.separator(h = 10, style = 'none') 


# create the buttons 
mc.separator(h = 10, style = 'none') 
mc.button(label = 'Apply', command = '') 


mc.button(label = 'Cancel', command = 'mc.deleteUI("windowTest9", window=True)') 

mc.showWindow() 

runGrid() 

回答

1

編輯:像DrWeeny說的那樣,最好引用其他類似的話題。


我做了我的博客上一點點提醒前一段時間,才能夠測試使用與測試它們的快速方式命令的所有不同的本土瑪雅UI方式:

  • 經典假象串
  • 函數作爲參數
  • 拉姆達
  • functools.partial
  • pymel.core.Callback

每種情況下還給出了具有傳遞變量作爲參數給這些函數的例子。因爲有時你必須能夠。 總的來說,我完全推薦使用functools.partial,它只提供優於其他的優點(如果你忘了PySide)。

Maya UI types

def function(*args): 
    print args 
    cmds.textFieldGrp(text, edit=True, text=str(args)) 

variable = 'Variable' 
width = [1, 250] 
align = [1, 'left'] 
window = cmds.window(title='UI and commands arguments.') 
cmds.columnLayout() 

cmds.textFieldGrp(label="\"function()\"", changeCommand="function()", columnWidth=width, columnAlign=align) 
cmds.textFieldGrp(label="function", changeCommand=function, columnWidth=width, columnAlign=align) 
cmds.textFieldGrp(label="\"function(variable)\"", changeCommand="function(variable)", columnWidth=width, columnAlign=align) 
cmds.textFieldGrp(label="lambda x: function(variable)", changeCommand=lambda x: function(variable), columnWidth=width, columnAlign=align) 
cmds.separator(style="double", height=20) 

import functools 
cmds.textFieldGrp(changeCommand=functools.partial(function), label='functools.partial(function)', columnWidth=width, columnAlign=align) 
cmds.textFieldGrp(changeCommand=functools.partial(function, variable), label='functools.partial(function, variable)', columnWidth=width, columnAlign=align) 
cmds.separator(style="single", height=20) 

import pymel.core 
cmds.textFieldGrp(changeCommand=pymel.core.Callback(function), label='pymel.core.Callback(function)', columnWidth=width, columnAlign=align) 
cmds.textFieldGrp(changeCommand=pymel.core.CallbackWithArgs(function), label='pymel.core.CallbackWithArgs(function)', columnWidth=width, columnAlign=align) 
cmds.textFieldGrp(changeCommand=pymel.core.CallbackWithArgs(function, variable), label='pymel.core.CallbackWithArgs(function, variable)', columnWidth=width, columnAlign=align) 

cmds.separator(style="single", height=20) 
text = cmds.textFieldGrp(label='RESULT: ', text='', width=500) 
cmds.showWindow() 

當使用類

因爲它沒有考慮採用類製成的,某些方面,當你在一個類中沒有在所有的工作。

class MayaUI(): 
    def __init__(self): 
     self.variable = 'Variable' 
     self.width = [1, 250] 
     self.align = [1, 'left'] 
     self.window = cmds.window(title='UI and commands arguments.') 
     cmds.columnLayout() 

     cmds.textFieldGrp(label="\"self.function()\"", changeCommand="self.function()", columnWidth=self.width, columnAlign=self.align) 
     cmds.textFieldGrp(label="self.function", changeCommand=self.function, columnWidth=self.width, columnAlign=self.align) 
     cmds.textFieldGrp(label="\"self.function(self.variable)\"", changeCommand="self.function(self.variable)", columnWidth=self.width, columnAlign=self.align) 
     cmds.textFieldGrp(label="lambda x: self.function(self.variable)", changeCommand=lambda x: self.function(self.variable), columnWidth=self.width, columnAlign=self.align) 
     cmds.separator(style="double", height=20) 

     import functools 
     cmds.textFieldGrp(changeCommand=functools.partial(self.function), label='functools.partial(self.function)', columnWidth=self.width, columnAlign=self.align) 
     cmds.textFieldGrp(changeCommand=functools.partial(self.function, self.variable), label='functools.partial(self.function, self.variable)', columnWidth=self.width, columnAlign=self.align) 
     cmds.separator(style="single", height=20) 

     import pymel.core 
     cmds.textFieldGrp(changeCommand=pymel.core.Callback(self.function), label='pymel.core.Callback(self.function)', columnWidth=self.width, columnAlign=self.align) 
     cmds.textFieldGrp(changeCommand=pymel.core.CallbackWithArgs(self.function), label='pymel.core.CallbackWithArgs(self.function)', columnWidth=self.width, columnAlign=self.align) 
     cmds.textFieldGrp(changeCommand=pymel.core.CallbackWithArgs(self.function, self.variable), label='pymel.core.CallbackWithArgs(self.function, self.variable)', columnWidth=self.width, columnAlign=self.align) 

     # A bit more complicated 
     _map = {'textFieldGrp': lambda arg:cmds.textFieldGrp(arg, query=True, text=True)} 
     _com = lambda *args:args[0](self.variable, _map[args[1]](args[2])) 
     cmds.textFieldGrp('textfieldName', changeCommand=pymel.core.Callback(_com, self.function, 'textFieldGrp', 'textfieldName'), label="pymel.core.Callback(_com, self.function, 'textFieldGrp', 'textfieldName') + lambdas", columnWidth=self.width, columnAlign=self.align) 

     cmds.separator(style="single", height=20) 
     self.text = cmds.textFieldGrp(label='RESULT: ', text='', width=500) 
     cmds.showWindow() 

    def function(self, *args): 
     print args 
     cmds.textFieldGrp(self.text, edit=True, text=str(args)) 

MayaUI() 
0

你可以走在這條等後看答案:Printing the label of a button when clicked或dictionnary這裏的用法:Maya Python - Using data from UI

from functools import partial 

def queryInputs(*args): 
    #args0 = label01 
    print(cmds.text(args[0], q=True, label = 1)) 
    #args[1] = int_01 
    print(cmds.intField(args[1], q=True, v = 1)) 
    #args[2] = cb_01 
    print(cmds.checkBox(args[2], q=True, v = 1)) 


def runGrid(): 
    if cmds.window('windowTest9', ex=True): 
     cmds.deleteUI('windowTest9', window=True) 

    cmds.window('windowTest9', title='BuilGen', sizeable=False, resizeToFitChildren=True) 

    cmds.rowColumnLayout(numberOfColumns = 2, columnWidth = [ (1, 150), (2, 100), (3, 75)]) 

    label_01 = cmds.text(label = 'number of sections wide:', align = 'left') 
    int_01 = buildingWidth = cmds.intField(value = 4) 

    cb_01 = numberOfFloors = cmds.checkBox (label='Y/N')  

    cmds.button(label = 'Apply', command = partial(queryInputs, label_01, int_01, cb_01)) 

    cmds.button(label = 'Cancel', command = 'cmds.deleteUI("windowTest9", window=True)') 

    cmds.showWindow() 

runGrid()