Python 使用pyqt-Can';不让单独的线程同时运行吗?
我正在尝试让PyQT GUI在python应用程序的ontop上运行,并且我已经尝试将其分为两个线程,以便GUI在我的主运行循环运行时能够响应,但我一直无法让它运行。也许我误解了。以下是我尝试过的: 我的Python 使用pyqt-Can';不让单独的线程同时运行吗?,python,multithreading,pyqt,Python,Multithreading,Pyqt,我正在尝试让PyQT GUI在python应用程序的ontop上运行,并且我已经尝试将其分为两个线程,以便GUI在我的主运行循环运行时能够响应,但我一直无法让它运行。也许我误解了。以下是我尝试过的: 我的窗口和工作者线程定义如下: class Window(QWidget): def __init__(self, parent = None): QWidget.__init__(self, parent) self.thread = Worker()
窗口
和工作者
线程定义如下:
class Window(QWidget):
def __init__(self, parent = None):
QWidget.__init__(self, parent)
self.thread = Worker()
start = QPushButton("Start", self)
QObject.connect(start, SIGNAL("clicked()"), MAIN_WORLD.begin)
hbox = QVBoxLayout(self)
hbox.addStretch(4)
class Worker(QThread):
def __init__(self, parent = None):
QThread.__init__(self, parent)
if __name__ == '__main__':
MAIN_WORLD = World()
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
这似乎与在线示例非常相似。我的World
类正在运行一个循环,该循环在用户单击“开始”直到再次单击之前是无限的。这里是它的部分定义
class World(QThread):
def __init__(self, parent = None):
QThread.__init__(self, parent)
self.currentlyRunning = False
//snip
def begin(self):
if self.currentlyRunning:
self.currentlyRunning = False
else:
self.currentlyRunning = True
self.MethodThatDoesUsefulStuff()
编辑:我注意到我并没有真正“使用”我的工作线程。如何将我的世界线程创建为工作线程 在仔细查看代码之后,您已经在QApplication之前启动了MAIN_WORLD,这不是您想要的 您希望执行以下操作:
if __name__ == '__main__':
app = QApplication(sys.argv)
sys.exit(app.exec_())
在窗口类中:
class Window(QWidget):
def __init__(self, *args):
self.world_thread = World();
# ...
上述操作将允许主线程控制gui,并允许工作线程在后台工作。授予PyQt而不是PySide,但:
- 不要子类QThread,子类QObject(请参阅)
- 然后,基本工作流是创建一个新线程,将工作线程移动到该线程中,启动该线程和工作线程。你的问题可能是你从来没有真正启动过你的新线程,初始化不会这样做——然后你的GUI和你的工作人员都在运行同一个线程,正如其他人所评论的那样。吉尔并没有真正进入画面。请查看QThread文档:
QApplication.processEvents()
,但我不确定这是否能在线程中工作(这确实是一个丑陋的黑客行为,而不是一个适当的修复)。这是错误的。GIL每100个Python ticks释放一次,不管它是否处于无限循环中。我建议看你在答案中链接的视频。