python从另一个类调用函数

时间:2014-09-18 06:19:09

标签: python-2.7 pyqt4

我只是想问一下如何从另一个类访问或调用该函数?

示例代码:

Class OpenOMX(QtCore.QThread):
    def __init__(self):
       QtCore.QThread.__init__(self)
    def run(self):
       'Statment here'
    def PlayPause(self):
       'Statment here'
Class VidPlayer(QtGui.QMainWindow):
    def __init__(self):
       QtGui.QMainWindow.__init__(self)
    def setupUI(self,MainWindow):
       'Statement here'
    def retranslateUI(self,MainWindow):
       self.btnPause.clicked.connect(OpenOMX.PlayPause)

我收到错误说:

TypeError: unbound method PlayPause() must be called with OpenOMX instance as first argument (got nothing instead)

2 个答案:

答案 0 :(得分:1)

直接从工作线程调用主GUI线程中的方法是不安全的,反之亦然。相反,您应该始终使用signals and slots

class OpenOMX(QtCore.QThread):
    statusChanged = QtCore.pyqtSignal(int)

    def __init__(self):
        QtCore.QThread.__init__(self)

    @QtCore.pyqtSlot()
    def PlayPause(self):
       'Statment here'
       ...
       self.statusChanged.emit(status)

class VidPlayer(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.openOMX = OpenOMX()
        self.btnPause.clicked.connect(self.openOMX.PlayPause)
        self.openOMX.statusChanged.connect(self.handleStatusChanged)

    @QtCore.pyqtSlot(int)
    def handleStatusChanged(self, status):
        print('status change:', status)

答案 1 :(得分:0)

在您的代码中,play PlayPause函数是OpenOMX类的方法。这意味着Python期望在该类的实例上调用,代码类似于instance.PlayPause()。如果您通过类直接访问该方法(例如OpenOMX.PlayPause),则会得到一个未绑定的方法,该方法要求您将实例作为参数传入。

您收到错误,因为您设置为调用PlayPause的按钮未在实例中传递。在您展示的代码中,您永远不会创建OpenOMX实例,因此即使您可以,也不清楚您要在哪里找到它。

我不确定在您的代码中创建实例的正确位置。也许你已经在你省略的代码部分中这样做了。如果没有,你必须自己判断最好创建一个。

无论如何,一旦你有OpenOMX个实例,你可以将PlayPause作为绑定方法传递给connect,其中包括:

def retranslateUI(self, MainWindow):
    self.btnPause.clicked.connect(self.whatever_you_named_your_instance.PlayPause)

绑定方法会自动将实例传递给函数。