我只是想问一下如何从另一个类访问或调用该函数?
示例代码:
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)
答案 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)
绑定方法会自动将实例传递给函数。