我有3个python文件:
文件包括许多类使用pyQt初始化Frame和其他GUI的任何方法。
文件,包括从跳跃运动中读取数据的Leap Motion Listener类。
用于启动其他类的主文件。
现在我想一起启动GUI框架和Leap Motion类。我试图在主类中启动两个线程但是存在很多问题。
此代码仅在运行pyQt框架时有效:
import sys
from PyQt4 import QtCore, QtGui
from Painter import GUI_animate
class StartQT4(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = GUI_animate()
self.ui.setupUi(self)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = StartQT4()
myapp.show()
sys.exit(app.exec_())
这就是我试图运行pyQt框架和Leap Motion类:
import sys
from PyQt4 import QtCore, QtGui
from Painter import GUI_animate
import LeapMotion
from threading import Thread
class StartQT4(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
t1 = Thread(target=show_frame())
t2 = Thread(target=start_LeapMotion())
t1.start()
t2.start()
self.ui.setupUi(self)
def start_LeapMotion():
LeapMotion.main()
def show_frame():
StartQT4.ui = GUI_animate()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = StartQT4()
myapp.show()
sys.exit(app.exec_())
但只有Leap Motion类运行,并且在完成从跳跃运动读取后,框架显示!
我怎么能一起运行它们?
答案 0 :(得分:4)
当您将show_frame
和start_LeapMotion
指定为线程的target
时,请不要将它们放在后面。 Python将functionName
解释为引用<function functionName at (memory location)>
的变量,而functionName()
是对该函数的调用。当您指定线程的target
时,您不想要传递对该函数的调用;你想传递这个功能。正如API for the threading module中所解释的那样,t1.start()
调用Thread
对象的run()
方法,除非你重写它,否则“调用传递给对象构造函数的可调用对象 target 参数“ - 请注意target
参数应该接收一个可调用对象(即函数本身,所以没有括号),而不是一个调用(这是你当前正在传递的)。