如何确保用户可以输入任何数据类型(str,float,int,boolean ...)?

时间:2017-01-04 09:55:07

标签: python-2.7 user-interface types user-input nuke

所以这是我在论坛上的第一个问题,我希望我做得对。 一般问题:如何在编写脚本时确保python不会返回任何错误,该脚本允许用户根据要更改的上下文或参数输入不同数据类型的值? 更具体:我是python的新手,想要编写一个脚本,允许The Foundry的Nuke用户一次更改同一类的多个节点上的值。根据要更改的所需参数是复选框(' bool')和RGBA输入(' 4浮点数')...输入必须是不同类型。搜索论坛后,我发现可以通过 type()函数检查类型,并在if语句中与 isinstance()函数进行比较。我想我可以使用它,但是例如Gradenode的乘法旋钮返回类型' AColor_Knob'。我期待像浮动一样。并且在isinstance()中进行比较并不会给我一个匹配,无论我与之比较的数据类型如何。

到目前为止的主要内容:

nukescripts.clear_selection_recursive()

userInput = nuke.getInput('Which type of nodes would you like to select? (!!!first char has to be capitalized!!!)',
                          'Shuffle')

matchingNodes = []

for each in nuke.allNodes():
    if each.Class() == userInput:
        matchingNodes.append(each)
    else:
        pass

for i in matchingNodes:
    i.setSelected(True)

nuke.message(str(len(
    matchingNodes)) + ' matching Nodes have been found and are now selected! (if 0 there either is no node of this type or misspelling caused an error!)')

userInput_2 = nuke.getInput('Which parameter of these nodes would you like to change? \n' +
                            '(!!!correct spelling can be found out by hovering over parameter in Properties Pane!!!)',
                            'postage_stamp')
userInput_3 = nuke.getInput('To what do you want to change the specified parameter? \n' +
                            '(allowed input depends on parameter type (e.g. string, int, boolean(True/False)))', 'True')

for item in matchingNodes:
    item.knob(userInput_2).setValue(userInput_3)

到目前为止我如何检查数据类型:

selected = nuke.selectedNode()
knobsel = selected.knob('multiply')
print(type(knobsel))
#if type(knobsel) == bool:
if isinstance(knobsel, (str,bool,int,float,list)):
    print('match')
else:
    print('no match')

1 个答案:

答案 0 :(得分:0)

您可以使用nuke.tcl()调用TCL命令。在TCL中,一切都是字符串,因此类型是无关紧要的(在某些命令中)。

p = nuke.Panel('Property Changer')
p.addSingleLineInput('class', '')
p.addSingleLineInput('knob', '')
p.addSingleLineInput('value', '')
p.show()

node_class = p.value('class')
knob_name = p.value('knob')
knob_value = p.value('value')

for node in nuke.allNodes(node_class):
    tcl_exp = 'knob root.{0}.{1} "{2}"'.format(node.fullName(),knob_name,knob_value)
    print tcl_exp
    nuke.tcl(tcl_exp)

那应该回答你的问题。有很多方法可以解决你想要做的事情 - 如果你想把它全部保存在python中,你可以对旋钮的值进行类型检查。例如:

b = nuke.nodes.Blur()
print type(b.knob('size').value()).__name__

这将创建一个Blur节点并打印该类型的字符串值。虽然我不建议使用此路由,但您可以使用它来转换值:

example = '1.5'
print type(example)
exec('new = {}(example)'.format('float'))
print type(new) 

另一种下行路线可能是为自己构建旋钮类型和期望值的自定义查找表。

修改

TCL Nuke命令: http://www.nukepedia.com/reference/Tcl/group__tcl__builtin.html#gaa15297a217f60952810c34b494bdf83d

如果您在nuke节点图中按X或转到文件> Comp Script Command,您可以选择TCL并运行:

knob root.node_name.knob_name knob_value

示例:

knob root.Grade1.white "0 3.5 2.1 1"

这将设置指定旋钮的值。