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.
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? –
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. –