2016-10-22 4 views
0

Aufgrund bestimmter Einschränkungen kann ich keine Klasse dafür verwenden, wie ich es normalerweise tun würde.Der Versuch, eine Variable an eine Funktion innerhalb einer Funktion zu übergeben. - Python

Ich muss eine Funktion eine Variable übergeben, aber die Funktion ist in einer anderen Funktion.

Hier ist der Code, den ich benutze, sei bitte sanft, ich bin kein Python-Zauberer und ich bin Autodidakt. Das Problem, auf das ich stoße, ist nButtons gibt False in meiner Funktion reColor zurück.

import maya.cmds as cmds 

nButtons = 4 

def ColorMeButtonsUI(nButtons): 
    def reColor(nButtons): 
     for i in range(nButtons): 
      cmds.button(str(i), edit = True, bgc = (1,1,1)) 

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

    if not nButtons: 
     nButtons = 3 

    if nButtons >= 2 and nButtons < 10: 
     colorUI = cmds.window('colorUI', title='Color me, Buttons', widthHeight=(200, 55), rtf = True ) 
     cmds.columnLayout(adjustableColumn=True) 
     cmds.button('Color', label='Color', command = reColor) 
     for i in range(nButtons): 
      cmds.button(str(i), label = 'Color'+str(i+1)) 
     cmds.setParent('..') 
     cmds.showWindow(colorUI) 
    else: 
     cmds.error ('Input is invalid. Please confirm input >1 and <10') 
    return nButtons 

ColorMeButtonsUI(nButtons) 

edit: der Befehl durch eine GUI-Taste ausgeführt wird: cmds.button('Color', label='Color', command = reColor)

+0

In der derzeit formatiert Code 'reColor' gibt nichts zurück. Bitte überprüfen Sie, ob die Einbuchtungen korrekt sind. – Philipp

+0

Der Code, den Sie eingefügt haben, ist der Einzug korrekt? –

Antwort

0

willkommen zu Stackoverflow, haben Sie bereits tun sie nicht, sich zu wiederholen versuchen, und einen Bereich für die Bearbeitung der bgc Iterieren, nett. Verwenden Sie jedoch Klassen, wie Sie es normalerweise tun würden, versuchen Sie, eine Bibliothek Dictionary für Ihre erstellten ui-Elemente zu verwenden und rufen Sie sie mit dem ui dag-Pfad auf. Instanz iteriert den Bereich, in dem Sie die Elemente Ihres Dikters mit weiteren Informationen für Ihre Handhabung durchlaufen würden.

import maya.cmds as cmds 
nButtons = 5 
# create a dict for the buttons 
ui_dict = {} 
def ColorMeButtonsUI(nButtons): 
    def reColor(*args): 
     # iterate the dict with the created buttons inside 
     for ui_id, ui_dag in ui_dict.iteritems(): 
      print ui_id, ui_dag 
      # and edit ther color 
      cmds.button(ui_dag, edit = True, bgc = (1,1,1)) 
      # you can also search for ids eg: 
      if str(2) in str(ui_id): 
       print ui_dag 

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

    if not nButtons: 
     nButtons = 3 
    # you can also use 
    # if 10>nButtons>= 2: 
    if nButtons >= 2 and nButtons < 10: 
     colorUI = cmds.window('colorUI', title='Color me, Buttons', widthHeight=(200, 55), rtf = True ) 
     cmds.columnLayout(adjustableColumn=True) 
     cmds.button('Color', label='Color', command = reColor) 
     #use the range start,end 
     for i in range(1,nButtons): 
      #create a relativ linking instance hard coded ids 
      #add element to dict 
      # we stay on your case and add the index too(not more needed except searching) 
      ui_dict[(i)] = cmds.button(label = 'Color'+str(i)) 
     cmds.setParent('..') 
     cmds.showWindow(colorUI) 
    else: 
     cmds.error ('Input is invalid. Please confirm input >1 and <10') 
    return nButtons 

ColorMeButtonsUI(nButtons) 
0

Ich schlage vor, Sie vermeiden die Erstellung einer Funktion in der anderen Funktion.

Wenn Sie die Funktion außerhalb hinzufügen:

def reColor(nButtons): 
     for i in range(nButtons): 
      cmds.button(str(i), edit = True, bgc = (1,1,1)) 


def ColorMeButtonsUI(nButtons): 
(...) 

können Sie umfärben verwenden, von innen ColorMeButtonsUI.

Beachten Sie auch, dass Sie kein Argument senden kann (nButtons in diesem Fall) einen Befehl über eine Schaltfläche aufrufen, wenn Sie

verwenden
from functools import partial 

Und dann teilweise() verwenden, auf dieses Argument Befehle. Ich schlage vor, Sie lesen this other post.

Mein Rat, nur für das Protokoll:

  • Uhr der identation. 4 Plätze auf jeder Identifikationsebene. Keine Tabs
  • Verwenden Sie keine Begrenzungen für Funktionsdefinitionen. Nur für Klassennamen. Also sollte es "colorMeButtonsUI" sein.
  • Wenn Sie nur reColor in colorMeButtons verwenden möchten, können Sie stattdessen __reColor (nButtons) aufrufen, so dass es privat ist (nicht vollständig privat, da Python nichts dergleichen hat, sondern nur den Funktionsnamen aus der Liste von verfügbare Komponenten dieser Datei). Oder nur _reColor mit einem Unterstrich, um darauf hinzuweisen, dass diese Funktion nur in dieser Datei verwendet werden soll.
0

Das Problem hat damit zu tun, wie Python Loop-Variablen behandelt. Wenn Sie versuchen, etwas in einer Schleife zu erstellen, erinnert sich Python an die Schleifenvariablen für Sie (dies ist technisch eine closure).

In der Regel ist dies praktisch - aber in einer Schleife wird die Schließung immer den letzten Wert der Schleife, nicht den Wert, den Sie wollten, wenn die Schleife ausgeführt wurde.Also, wenn Sie etwas offensichtlich wie folgt versucht:

for n in range (nbuttons): 
    def button_func (*_): 
     print "color", n 
    cmds.button(label = "color %i" %n, c = button_func) 

Sie würden Tasten erhalten richtig beschriftet - aber sie würden aus dem Wert von nbuttons alle drucken, da der Verschluss am Ende der Schleife passieren würde. Es ist definitiv verwirrend.

Die Regel für Schließungen ist, dass sie passieren, wenn ein Bereich abgeschlossen ist. Sie müssen das also etwas früher tun, indem Sie eine Unterfunktion (die einen eigenen Bereich erstellt) erstellen und diese Funktion aus der Schleife aufrufen. Also:

def ButtonUI(nbuttons =3): 

    colorUI = cmds.window(title='Color me, Buttons', widthHeight=(200, 55), rtf = True ) 
    cmds.columnLayout(adjustableColumn=True) 
    def generate_button(idx): 
     def callback(*_): # < will inherit the value of idx automatically 
      print "color", idx 
     cmds.button(label = 'color %i' %idx, c = callback) 

    for n in range(1, nbuttons +1): 
     generate_button(n) 
    cmds.showWindow(colorUI) 

In diesem arangement generate_button den Wert von idx greifen und koppelt es mit der privaten callback Funktion korrekt, so dass jede Taste wird aus dem gleichen Indexwert wie das Etikett drucken. Die Sub-Sub-Funktion verwendet den Abschluss, um den richtigen Wert zu speichern. Sie könnten das gleiche mit einem functools.partial Objekt tun, aber sobald Sie sehen, wie die Schließungen funktionieren, ist das nicht erforderlich.

Mehr auf UI zu schaffen, in Schleifen here

Verwandte Themen