class2は私の主なAPPで、favListからのボタンのリストを表示します。 displayLibraryでは、Class1インスタンスでボタンを作成します。 ユーザーがボタン(simulateButtonClick)をクリックすると、Class1からduplicateNetwork関数を実行する必要がありました。 Mayaでオブジェクトを複製するために必要な作業をすべて行い、Class2.addSlot関数を使用してこの資料を追加しますClass2.displayLibraryから 1. - > Class2.simulateButtonClick使用した場合のClass1 2のインスタンスでボタンを作成 - >後藤を:。そこにチェックし、不要なコードをしたくない)データを送信し、インスタンスなしでクラス間でdefを使用する - おそらくシングルトンパターン
のだから、取引はこれらの接続を作成することですClass1.duplicateNetwork - > goto Class2.addSlot ボタンからduplicateNetworkを呼び出すと、前に作成したインスタンスとそのインスタンスを呼び出すので、2番目のインスタンスは最も難しいものです。 私はClass2.addSlotに復帰したいときにインスタンスを作成できません。私は私が一番最初から使用している唯一のものを使用しなければなりません。 なぜ私はシングルトンを使用しようとしています。
エラーの原因となった2行についてコメントしました。場合はシングルトンでは、私は他にclass_がを得たので ボタン[i]を=のClass1(OBJ)
Traceback (most recent call last):
File "G:\kTools\singlethon.py", line 46, in <module>
run = Class2()
File "G:\kTools\singlethon.py", line 27, in __init__
self.displayLibrary()
File "G:\kTools\singlethon.py", line 38, in displayLibrary
buttons[i] = Class1(obj)
File "G:\kTools\singlethon.py", line 13, in __new__
class_._instances[class_].__init__(class_, *args, **kwargs)
TypeError: __init__() takes exactly 2 arguments (3 given)
ザッツ:
favList = []
buttons = {}
favList.append("shader1")
favList.append("shader2")
favList.append("shader3")
favList.append("shader4")
class Singleton(object):
_instances = {}
def __new__(class_, *args, **kwargs):
if class_ not in class_._instances:
class_._instances[class_] = super(Singleton, class_).__new__(class_, *args, **kwargs)
else:
# class_._instances[class_].__init__(class_, *args, **kwargs)
class_._instances[class_].__init__(*args, **kwargs)
return class_._instances[class_]
class Class1(Singleton):
def __init__(self, name):
print ("Just test if name is working: {0}").format(name)
@staticmethod
def duplicateNetwork(self):
newMaterial = "shader8000"
Class2.addSlot(newMaterial)
class Class2(Singleton):
def __init__(self):
print "Do something in Class2"
self.displayLibrary()
self.simulateButtonClick()
def addSlot(self, shaderName=None):
favList.append(shaderName)
self.displayLibrary()
def displayLibrary(self):
for i,obj in enumerate(favList):
# create button with Class1 Instance
buttons[i] = Class1(obj)
print("Shader library contains: {0}").format(obj)
def simulateButtonClick(self):
material = "Shader6000"
# Simulate click for button "Shader1"
buttons[0].duplicateNetwork(self)
run = Class2()
は今、私はエラーを得ました。私もその行にコメントしましたが、なぜそれを教えてくれますか?私はなぜ* args ** kwargsする必要があるのかわかりません、私は主に彼らが何であるか知っていますが、私はシングルトンでそれらを必要とするアイデアはありません。
Traceback (most recent call last):
File "G:\kTools\singlethon.py", line 49, in <module>
run = Class2()
File "G:\kTools\singlethon.py", line 31, in __init__
self.simulateButtonClick()
File "G:\kTools\singlethon.py", line 46, in simulateButtonClick
buttons[0].duplicateNetwork(self)
File "G:\kTools\singlethon.py", line 25, in duplicateNetwork
Class2.addSlot(newMaterial)
TypeError: unbound method addSlot() must be called with Class2 instance as first argument (got str instance instead)
そして、この1のために、私は最初から問題を抱えて:
第二にエラーがあります。どのようにそれを解決するか考えていない。
あなたは完全な作業例を提供してもらえますか? 'favoriteMaterial_UI.addSlot(shader)'でコメントを付けたコードを使用すると、 'RightClickMenuButton()'を実行してもエラーは表示されません... また、どのバージョンのPythonを使用していますか? – Silmathoron
これは私の完全なコードスケッチです。 http://pastebin.com/4rPv3xDGとQTutilsを使用してhttp:// pastebinをインポートします。com/ANUVkX1D Autodesk Mayaで実行することができます – user2455219
'favoriteMaterial_UI'を作成する際に、ラップトップでコードを実行するために多くのことをコメントしています... ' __call__'を '__new__'に変更しました。私にはもっと意味があります。 不要なライブラリ(maya、shibokenなど)を使わずに**実際の**最小限の作業例を試してみてください。この例では、誰もが同じコードを実行できるように、あなたを困らせるエラーが表示されます。 あなたの投稿を編集して古いコードを置き換えてください。 – Silmathoron