Python,类中的一个类,如何从上层类访问变量

2024-10-03 21:33:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个QtGui类,它处理所有变量(p1p2)的调整和滑块等。在这个类中,我有一个OSC侦听器类,它应该监听来自另一个设备的触发信号和一个变量p3,并使用这些参数来触发声音和图形。但是我无法访问侦听器类中的p1p2。下面是一个例子:

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.p1的“self”指的是OscListener,而不是{}。而且do_stuff_listener在一个单独的线程中,是否仍然可以访问self.p1和{}?在

我希望用户界面最终控制参数值。每次通过OSC接收到触发信号,它将生成一个新的图形和声音。如果有更好的方法,请给出建议。在


Tags: selfdatainitdefdooscp2p3
2条回答

你想达到的目标可以这样做:

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

请注意,不需要从代码示例中嵌套类。在

而且,在我看来,你想要达到的目标是不正确的。代码是非常耦合的。考虑分离Ptsgui和{}。查看Observer pattern获取一些灵感。在

{{cd2>你可以通过这个}:

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

相关问题 更多 >