2016-03-24 8 views
1

Class2, favList düğmelerinin listesini gösteren ana uygulamamdır. GöstergedeLibrary Class1 Instance ile düğme oluşturuyorum. Kullanıcı bir düğmeyi tıklattığında (simulateButtonClick), Class1 'dan duplicateNetwork işlevini çalıştırmam gerekiyordu. Maya'da nesneyi çoğaltmak için gereken tüm şeyleri yapacağız ve bu malzemeyi Class2.addSlot işlevini kullanarak eklemek istiyorum (çünkü çok fazla aldımVerileri iletme ve örnek olmayan sınıflar arasındaki def'leri kullanma - muhtemelen Singleton Pattern

yüzden anlaşma bu bağlantıları oluşturmaktır orada kontrol ve gereksiz kod istemiyorum) tarihi. - Class2.simulateButtonClick kullanıldığında> Class1 2. örneği ile düğmeler oluşturmak - Class2.displayLibrary itibaren 1.> git Class1.duplicateNetwork -> goto Class2.addSlot Ve ikincisi en zor olanı, çünkü butondan duplicateNetwork çağıracağım zaman, daha önce oluşturduğum örneği ve onun güzelini arıyorum. ama Class2.addSlot'a geri dönmek istediğimde örnek oluşturamıyorum. Kullanmakta olduğum tek şeyi kullanmam gerek. neden bu yüzden Singleton kullanmaya çalışıyorum.

Hatalara neden olan 2 satırı yorumladım.

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() 

Şimdi hataları var: düğmeleri [i] = Sınıf1 (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) 

Thats olarak tekil Başka Eğer içinde class_ var çünkü. Bu çizgiyi de söyledim, ama nedenini söyleyebilir misin? Neden * args ** kwargs olması gerektiğini bilmiyorum, çoğunlukla ne olduklarını biliyorum, ama hiçbir fikrin neden Singleton'a ihtiyacım var.

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) 

Ve bunun için, ben baştan sorun var:

İkinci hatadır. Bunu nasıl çözeceğine dair bir fikrim yok.

+0

Eğer tam bir çalışma örneği yüzden daha kolay neyin yanlış olduğunu görebilirsiniz verebilir misiniz: trick (muhtemelen Singleton gerekmez) yapmalıdır? Kodunuzu 'favoriteMaterial_UI.addSlot (shader)' ile kullanmak, 'RightClickMenuButton() '... 'u çalıştırırken bana hata veriyor, python'un hangi sürümünü kullanıyorsunuz? – Silmathoron

+0

Tabii ki bu benim tam kod taslağım. http: // pastebin dosyasını içe aktarmak için http://pastebin.com/4rPv3xDG ve QTutils.com/ANUVkX1D Autodesk Maya – user2455219

+0

'da çalıştırabilirsiniz Kodunuzun dizüstü bilgisayarımda çalışması için bir çok şey yorumlamak, "favoriteMaterial_UI" ... 'u oluştururken herhangi bir hata vermez. Ayrıca, __call__' - '__new__' olarak değiştirirsiniz. bana daha çok anlam ver. Lütfen herkesin aynı kodu çalıştırması için sizi rahatsız eden hatayı görüntüleyen gereksiz bir kitaplık (örneğin, maya, shiboken, vb.) Olmayan bir ** gerçek ** çalışma örneğini deneyin. Eski kodu değiştirmek için gönderinizi düzenleyin. – Silmathoron

cevap

0

yeni düzenlemeyi gördükten sonra olmasaydı

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() 

, sana sadece bu yüzden bu her Class1 içine Class2 bir başvuru istiyorum düşünüyorum

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

Kodumda daha az karmaşık arama yapabileceğimi görüyorum ve bunu yapacağım. Ben sadece öğreniyorum ve programlama arka planı olmadan, her zaman dilenenlerden net değildir. Statik yöntem kullandınız, ancak class favouriteMaterial_UI sınıfında RightClickMenuButton sınıfındaki herhangi bir def'i çalıştırmadınız. Bunu yapmaya çalıştığımda hala aynı tür hatalar var. Başka bir yapıyı kullanabilsem bile, her seferinde yeni örnekler oluşturmadan sınıflar arasında defler aramam için bana yardımcı olabilirsiniz. Bu yüzden Singleton'u kullanmaya çalıştım. Şimdi verdiğiniz kodu yazdım, Singleton'u silebilirim ve hala aynı – user2455219

+0

(neden ebeveynleri, isimleri ve * args'leri, ** kwargs'leri süper çağrılara geçiriyorsunuz?) Bu örnekte gerekli değildir, ancak Maya için – user2455219

+0

PySide'de UI oluşturmama yardımcı oldular Tamam, ne yapmak istediğinizi tam olarak açıklayabilir misiniz? "Sınıflar arasında arama defs" ile ne demek istiyorsun? (herkese açık hale getirmek için ilk yazınızı düzenlemeye çalışın) Ayrıca, karşılaştığınız tam hatayı (** bütün ** mesaj) lütfen yazınız: gördüğünüz gibi, ne Kevin ne de bana böyle bir şey almıyoruz ... – Silmathoron

0

Tamam, sanırım bunu düzeltebildim. sadece argüman olarak eksik self eksik.

RightClickMenuButton.duplicateNetwork(self) 

ve bunu çalıştırdığınızda i hat 27 üzerinde başka bir hata var bu yüzden o self ekleyerek tekrar sabit.

favoriteMaterial_UI.addSlot(self, shader) 

böylece nihai kodudur. Bu i başkası size yardımcı olabilir umut için nerede ne arıyor! :)

+0

Hata yok mu? Ben var: satır 38, wymuszonyKlikPrzycisku içinde RightClickMenuButton.duplicateNetwork (öz) TypeError: Sygnal z init: ilişkisiz yöntem duplicateNetwork() ilk argüman olarak RightClickMenuButton örneği ile çağrılmalıdır Senaryo çıkışı gibi olmalıdır (yerine favoriteMaterial_UI örneği var) favoriteMaterial_UI/ Wyswietlam liste:/ shader1/ shader2/ tıklama/ Sygnal z duplikateNetwork/ Sygnal z refreshSlot/ Wyswietlam liste:/ shader1/ shader2/ shader3 – user2455219

+0

hayır, im emin neden alıyorsanız değil bir hata. 'Sygnal z favoriteMaterial_UI Wyswietlam liste init: shader1 shader2 tık Sygnal z duplikateNetwork Sygnal z refreshSlot Wyswietlam liste: shader1 shader2 shader3' i got çıktı üretmesi bu. –

+0

Doğru çıktı aldınız. Belki python'um 2.7 mi? Seninki nedir? Bazı yeni kodlarla gönderiyi güncelledim, sizin için çalışıyor mu? (Sadece kontrol etmeden önce butonu tıklamayı unutma) – user2455219

İlgili konular