2016-03-24 4 views
1

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のために、私は最初から問題を抱えて:

第二にエラーがあります。どのようにそれを解決するか考えていない。

+0

あなたは完全な作業例を提供してもらえますか? 'favoriteMaterial_UI.addSlot(shader)'でコメントを付けたコードを使用すると、 'RightClickMenuButton()'を実行してもエラーは表示されません... また、どのバージョンのPythonを使用していますか? – Silmathoron

+0

これは私の完全なコードスケッチです。 http://pastebin.com/4rPv3xDGとQTutilsを使用してhttp:// pastebinをインポートします。com/ANUVkX1D Autodesk Mayaで実行することができます – user2455219

+0

'favoriteMaterial_UI'を作成する際に、ラップトップでコードを実行するために多くのことをコメントしています... ' __call__'を '__new__'に変更しました。私にはもっと意味があります。 不要なライブラリ(maya、shibokenなど)を使わずに**実際の**最小限の作業例を試してみてください。この例では、誰もが同じコードを実行できるように、あなたを困らせるエラーが表示されます。 あなたの投稿を編集して古いコードを置き換えてください。 – Silmathoron

答えて

0

新しい編集を見た後、私はあなたがちょうどこのため、各Class1内部Class2への参照をしたいと思えば(おそらくSingletonを必要としない)トリックを行う必要があります:私たちは、より簡単に間違っているものを見ることができるように

from weakref import proxy 

favList = [] 
buttons = {} 
favList.append("shader1") 
favList.append("shader2") 
favList.append("shader3") 
favList.append("shader4") 

class Class1: 
    def __init__(self, name, parent): 
     self.parent = proxy(parent) 
     print ("Just test if name is working: {0}").format(name) 

    def duplicateNetwork(self): 
     newMaterial = "shader8000" 
     self.parent.addSlot(newMaterial) 

class Class2: 
    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, parent=self) 
      print("Shader library contains: {0}").format(obj) 

    def simulateButtonClick(self): 
     material = "Shader6000" 
     # Simulate click for button "Shader1" 
     buttons[0].duplicateNetwork() 


run = Class2() 
+0

私のコードでは、あまり複雑ではない呼び出しを行うことができます。私はそれを行います。私はちょうど学びており、プログラミングのバックグラウンドがなくても、いつものようにはっきりしているわけではありません。 staticメソッドを使用しましたが、あなたはclass favoriteMaterial_UIのクラスRightClickMenuButtonからdefを実行していませんでした。私がそれをしようとすると、私はまだ同じ種類のエラーを持っています。別の構造体を使うことができても、毎回新しいインスタンスを作成せずにクラス間でdefを呼び出す方法を教えてください。それで私はシングルトンを使用しようとしたのです。今度はあなたが与えたコードは、私はシングルトンを削除することができます。それでも同じように動作します – user2455219

+0

(親コール、名前、* args、** kwargsをスーパーコールに渡しますか?) この例では、 MayaのPySideでUIを作成するのに役立ちました – user2455219

+0

さて、あなたがしたいことを正確に説明できましたか? 「クラス間のコール定義」とはどういう意味ですか? あなたが遭遇した正確なエラー(**全体**メッセージ)を投稿してください:あなたが見ているように、ケヴィンも私もそういうものを手に入れていません... – Silmathoron

0

さて、私はそれを修正することができたと思います。 あなたはちょうど引数として、selfがありませんでした。

RightClickMenuButton.duplicateNetwork(self) 

私がそれを実行したとき、27行目に別のエラーが発生したので、もう一度selfを追加することで修正しました。

favoriteMaterial_UI.addSlot(self, shader) 

ですので、最終的なコードはです。

favList = [] 
favList.append("shader1") 
favList.append("shader2") 
class Singleton(type): 
    _instances = {} 
    def __call__(cls, *args, **kwargs): 
     if cls not in cls._instances: 
      cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) 
     else: 
      cls._instances[cls].__init__(*args, **kwargs) 
      # class_._instances[class_].__init__(class_, *args, **kwargs) 
     return cls._instances[cls] 

class RightClickMenuButton(object): 
    __metaclass__ = Singleton 
    def __init__(self): 
     print("Sygnal z Init RightClickMenu") 
     self.addMenuActions() 

    def addMenuActions(self): 
     print("Sygnal z addMenuActions") 
     self.duplicateNetwork() 

    def duplicateNetwork(self): 
     shader = "shader3" 
     print("Sygnal z duplikateNetwork") 
     favoriteMaterial_UI.addSlot(self, shader) 

class favoriteMaterial_UI(object): 
    __metaclass__ = Singleton 
    def __init__(self): 
     print("Sygnal z init favoriteMaterial_UI") 
     self.displayLibrary() 
     self.wymuszonyKlikPrzycisku() 

    def wymuszonyKlikPrzycisku(self): 
     print("click") 
     RightClickMenuButton.duplicateNetwork(self) 

    def addSlot(self, obj): 
     favList.append(obj) 
     self.refreshSlot() 

    def displayLibrary(self): 
     print("Wyswietlam liste:") 
     for obj in favList: 
      print(obj) 

    def refreshSlot(self): 
     print("Sygnal z refreshSlot") 
     self.displayLibrary() 


c = favoriteMaterial_UI() 

これが探しているあなたは、私は他の誰かがあなたを助けることができると思いますものではありませんでした!:)

+0

あなたはエラーがありますか?私が得た:行38、wymuszonyKlikPrzycisku RightClickMenuButton.duplicateNetwork(自己)に はTypeError:未結合の方法duplicateNetwork()は最初の引数としてRightClickMenuButtonインスタンスで呼び出さなければなりません(代わりにfavoriteMaterial_UIインスタンスを得た) スクリプトの出力は次のようにする必要があります: Sygnalのzのinit favoriteMaterial_UI/ Wyswietlam LISTE:/ shader1/ shader2/ クリック/ Sygnal Z duplikateNetwork/ Sygnal Z refreshSlot/ Wyswietlam LISTE:/ shader1/ shader2/ shader3 – user2455219

+0

いや、イムわからないなぜあなたが取得しています エラー。 'Sygnal Zのinit favoriteMaterial_UI Wyswietlam LISTE: shader1 shader2 クリック Sygnal Z duplikateNetwork Sygnal Z refreshSlot Wyswietlam LISTE: shader1 shader2 shader3' 私が得た出力のthats。 –

+0

正しい出力が得られました。たぶん私のpythonの原因は2.7ですか?君は? 新しいコードでポストを更新しましたが、あなたのために働いていますか? – user2455219

関連する問題