私はQt Gui
クラスを持っています。すべての変数(p1
、p2
)の調整はスライダーやもので行います。このクラスの中で、私は、トリガー信号と他のデバイスからのp3
という変数を聴いていたはずのOSCリスナークラスを持ち、そのパラメータを使ってサウンドとグラフィックをトリガーします。しかし、リスナークラスのp1
、p2
にアクセスするのに問題があります。次に例を示します。Python、クラス内のクラス、上位クラスの変数にアクセスする方法
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()
だからここに私はoscListener()
が直接self.p1
とself.p2
にアクセスするために利用できるようにしたいです。そして明らかに私はself.p1
の '自己'がOscListener
を指し、Ptsgui
を指さないので、これではできません。またdo_stuff_listener
は別のスレッドにありますが、self.p1
とself.p2
にはまだアクセスできますか?
最終的に、私はユーザがパラメータ値を制御するためのGUIを期待しています。トリガー信号がOSC
で受信されるたびに、新しいグラフとサウンドが生成されます。これを行うより良い方法があればアドバイスをしてください。
ありがとうございます。これは私が必要とするものです。それはPtsguiのポインタをOscListenerに渡すことを意味しますか?その場合、OscListenerのp1とp2の値を直接変更できますか? –
はい、正しく入力してください。あなたはそれを行うことができますが、私が言及したように、コードは非常に結合されています。より良いソリューションをご希望の場合は、いくつかのデザインパターンを使用してデカップリングを試みてください。オブザーバーパターン。 –