下面是我列出一个目录的所有子目录的代码。我用它来理解QThread
以及PySide中的信号和插槽。问题是,当我没有在Main
类的scan()
方法中使用Qtcore.QApplication.processEvents()
时,代码就不能工作了。事件循环是否尚未运行?在
import sys
import os
import time
from PySide import QtGui, QtCore
class Scanner(QtCore.QObject):
folderFound = QtCore.Signal(str)
done = QtCore.Signal()
def __init__(self, path):
super(Scanner, self).__init__()
self.path = path
@QtCore.Slot()
def scan(self):
for folder in os.listdir(self.path):
time.sleep(1)
self.folderFound.emit(folder)
class Main(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.resize(420,130)
self.setWindowTitle('Threads')
self.lyt = QtGui.QVBoxLayout()
self.setLayout(self.lyt)
self.topLyt = QtGui.QHBoxLayout()
self.lyt.addLayout(self.topLyt)
self.scanBtn = QtGui.QPushButton('Scan')
self.scanBtn.clicked.connect(self.scan)
self.clearBtn = QtGui.QPushButton('Clear')
self.topLyt.addWidget(self.scanBtn)
self.topLyt.addWidget(self.clearBtn)
self.folders = list()
self.show()
def scan(self):
self.th = QtCore.QThread()
scanner = Scanner(r"D:\\")
scanner.moveToThread(self.th)
scanner.folderFound.connect(self.addFolder)
scanner.done.connect(scanner.deleteLater)
scanner.done.connect(self.quit)
self.th.started.connect(scanner.scan)
self.th.start()
QtCore.QApplication.processEvents()
@QtCore.Slot()
def addFolder(self, folder):
lbl = QtGui.QLabel(folder)
self.folders.append(lbl)
self.lyt.addWidget(lbl)
@QtCore.Slot()
def quit(self):
self.th.quit()
self.th.wait()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
main = Main()
app.exec_()
事件循环不是背着你跑的东西。你总是要管理它。一个线程不能同时做两件事:如果你的代码是控制点,那么事件循环显然不是!您需要从代码返回到事件循环,并确保您的代码是从事件循环调用的。任何类型的UI信号、网络事件或超时都是从事件循环调用的,因此您的代码很可能已经在调用堆栈上有了事件循环。不过,要想让循环继续旋转,你必须回到它身上。在
永远不要使用
processEvents
-相反,请反转控件,以便事件循环调用代码,然后执行一大块工作,最后返回到事件循环。在“保持代码不受事件循环影响”的习惯用法是零持续时间计时器。执行工作的callable附加到超时信号。在
你的例子能起作用纯属侥幸。在
当您试图调用}模块中。但是,引发异常的副作用是阻止对
QtCore.QApplication.processEvents()
时,将引发一个NameError
,因为QApplication
类实际上在QtGui
模块中,而不是{scanner
对象进行垃圾回收,因此线程似乎正常运行。在修复代码的正确方法是保留对
scanner
对象的引用,并去掉processEvents
行,这是不需要的:剩下的代码没问题,示例现在可以按预期工作了。在
相关问题 更多 >
编程相关推荐