2016-08-28 4 views
0

Ich habe Qt Gui Klasse, die alle Variablen behandelt (p1, p2) Anpassung mit Schiebereglern und so. Innerhalb dieser Klasse habe ich eine OSC-Listener-Klasse, die Signale von einer anderen Einheit abhören sollte und eine Variable p3 und die Parameter verwenden sollte, um Ton und Grafik auszulösen. Aber ich habe Probleme beim Zugriff auf p1, p2 in der Listener-Klasse. Hier ein Beispiel:Python, Eine Klasse innerhalb einer Klasse, wie auf Variablen aus der Oberklasse zugreifen

class Ptsgui(QtGui.QMainWindow): 
    def __init__(self): 
     super(Ptsgui, self).__init__() 
     self.p1, self.p2, self.data = 0, 0, np.zeros(10) 
     self.initUI() 

    class OscListener(object): 
     def __init__(self, data): 
      self.listenerData = data 
      self.receive_address = '127.0.0.1', 7000 
     def do_stuff_listener(self, addr, tags, stuff, source): 
      print self.p1 
      print self.p2 
      self.p3 = stuff[0] 
      trigger_sound_and_graphic(self.p1, self.p2, self.p3) 

     def spawn(self): 
      self.receiveServer = OSC.OSCServer(self.receive_address) 
      self.receiveServer.addDefaultHandlers() 
      self.receiveServer.addMsgHandler("/trigger", self.do_stuff_listener() 
      self.emorating_oscServer = threading.Thread(target=self.receiveServer.serve_forever) 
      self.emorating_oscServer.start() 

    def initUI(): 
     """ 
     Some sliders setup for change the p1 & p2 
     """ 
     self.setGeometry(50, 50, 1050, 650) 
     mainlayout = QtGui.QVBoxLayout() 
     self.widget = QtGui.QWidget() 
     self.widget.setLayout(mainlayout) 
     self.listener = OscListener(data = self.data) 
     self.show() 

So, hier möchte ich die oscListener() zur Verfügung stehen direkt self.p1 und self.p2 zuzugreifen. Und das kann ich natürlich nicht, denn self.p1 's' bezieht sich auf OscListener aber nicht Ptsgui. Auch die do_stuff_listener ist in einem separaten Thread, ist es noch möglich, auf self.p1 und self.p2 zuzugreifen?

Letztendlich hoffe ich auf die GUI für den Benutzer, um die Parameterwerte zu steuern. Und jedes Mal, wenn ein Triggersignal über OSC empfangen wird, erzeugt es eine neue Grafik und einen neuen Sound. Bitte beraten Sie, wenn es einen besseren Weg gibt, dies zu tun.

Antwort

0

Was versuchen Sie, wie das getan zu erreichen werden:

class Ptsgui(QtGui.QMainWindow): 
    def __init__(self): 
     super(Ptsgui, self).__init__() 
     self.p1, self.p2, self.data = 0, 0, np.zeros(10) 
     self.initUI() 

    def initUI(): 
     """ 
     Some sliders setup for change the p1 & p2 
     """ 
     self.setGeometry(50, 50, 1050, 650) 
     mainlayout = QtGui.QVBoxLayout() 
     self.widget = QtGui.QWidget() 
     self.widget.setLayout(mainlayout) 
     self.listener = OscListener(gui=self, data=self.data) 
     self.show() 


class OscListener(object): 
    def __init__(self, gui, data): 
     self.gui = gui 
     self.listenerData = data 
     self.receive_address = '127.0.0.1', 7000 
    def do_stuff_listener(self, addr, tags, stuff, source): 
     print self.gui.p1 
     print self.gui.p2 
     self.p3 = stuff[0] 
     trigger_sound_and_graphic(self.gui.p1, self.gui.p2, self.gui.p3) 

    def spawn(self): 
     self.receiveServer = OSC.OSCServer(self.receive_address) 
     self.receiveServer.addDefaultHandlers() 
     self.receiveServer.addMsgHandler("/trigger", self.do_stuff_listener() 
     self.emorating_oscServer = threading.Thread(target=self.receiveServer.serve_forever) 
     self.emorating_oscServer.start() 

Sehen Sie, dass die Klasse Verschachtelung von Ihrem Codebeispiel nicht ist erforderlich.

Auch scheint es mir, dass was Sie versuchen zu erreichen ist nicht richtig. Der Code ist extrem gekoppelt. Berücksichtigen Sie die Entkopplung Ptsgui und OscListener. Überprüfen Sie Observer pattern für etwas Inspiration.

+0

Danke. Das ist genau das, was ich brauche. Bedeutet das, dass es die Zeiger von Ptsgui an OscListener weitergibt? Kann ich in OscListener die Werte von p1 und p2 direkt ändern? –

+0

Ja, richtig. Sie können das tun, aber wie bereits erwähnt, ist der Code sehr stark gekoppelt. Wenn Sie eine bessere Lösung wünschen, versuchen Sie, sie mit einigen Entwurfsmustern zu entkoppeln, z. Beobachtermuster. –

0

Sie konnten die Ptsgui zu OscListener wie dies passieren:

class Ptsgui(QtGui.QMainWindow): 
    def __init__(self): 
     super(Ptsgui, self).__init__() 
     self.p1, self.p2, self.data = 0, 0, np.zeros(10) 
     self.initUI() 

    class OscListener(object): 
     def __init__(self, cls, data): 
      self.parent = cls 
      self.listenerData = data 
      self.receive_address = '127.0.0.1', 7000 
     def do_stuff_listener(self, addr, tags, stuff, source): 
      print self.parent.p1 # Access it. 
      print self.parent.p2 
      self.p3 = stuff[0] 
      trigger_sound_and_graphic(self.p1, self.p2, self.p3) 

     def spawn(self): 
      self.receiveServer = OSC.OSCServer(self.receive_address) 
      self.receiveServer.addDefaultHandlers() 
      self.receiveServer.addMsgHandler("/trigger", self.do_stuff_listener() 
      self.emorating_oscServer = threading.Thread(target=self.receiveServer.serve_forever) 
      self.emorating_oscServer.start() 

    def initUI(): 
     """ 
     Some sliders setup for change the p1 & p2 
     """ 
     self.setGeometry(50, 50, 1050, 650) 
     mainlayout = QtGui.QVBoxLayout() 
     self.widget = QtGui.QWidget() 
     self.widget.setLayout(mainlayout) 
     self.listener = OscListener(cls=self, data = self.data) # Pass it here 
     self.show() 
Verwandte Themen