2016-08-28 16 views
0

私はQt Guiクラスを持っています。すべての変数(p1p2)の調整はスライダーやもので行います。このクラスの中で、私は、トリガー信号と他のデバイスからのp3という変数を聴いていたはずのOSCリスナークラスを持ち、そのパラメータを使ってサウンドとグラフィックをトリガーします。しかし、リスナークラスのp1p2にアクセスするのに問題があります。次に例を示します。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.p1self.p2にアクセスするために利用できるようにしたいです。そして明らかに私はself.p1の '自己'がOscListenerを指し、Ptsguiを指さないので、これではできません。またdo_stuff_listenerは別のスレッドにありますが、self.p1self.p2にはまだアクセスできますか?

最終的に、私はユーザがパラメータ値を制御するためのGUIを期待しています。トリガー信号がOSCで受信されるたびに、新しいグラフとサウンドが生成されます。これを行うより良い方法があればアドバイスをしてください。

答えて

0

何を達成しようとそのように行うことができます。

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

はあなたのサンプルコードからクラスのネストがないことを参照してください。必要です。

また、あなたが達成しようとしていることは正しくないと思われます。コードは非常に結合されています。デカップリングはPtsguiOscListenerです。いくつかのインスピレーションのためにObserver patternをチェックしてください。

+0

ありがとうございます。これは私が必要とするものです。それはPtsguiのポインタをOscListenerに渡すことを意味しますか?その場合、OscListenerのp1とp2の値を直接変更できますか? –

+0

はい、正しく入力してください。あなたはそれを行うことができますが、私が言及したように、コードは非常に結合されています。より良いソリューションをご希望の場合は、いくつかのデザインパターンを使用してデカップリングを試みてください。オブザーバーパターン。 –

0

あなたはこのようOscListenerPtsguiを渡すことができます。

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() 
関連する問題