在Qt上使用watchdog改变QLabel文本



我想做什么:每当在监视文件夹中创建新文件时(使用Watchdog),更改QLabel文本。

使用下面的代码创建新文件时,QLabel文本不会更新。(但调试成功打印到控制台)

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
#This starts the watchdog when button pushed        
self.pushButton_3.clicked.connect(self.start)

监督机构代码

def start(self): 
#Monitoring folder           
path = self.lineEdit_2.text()
## Handler to update text when a file is created
class MyHandler(FileSystemEventHandler):
def on_created(self, event):
**##LABEL_5 should be updated when new file created.**                    
MainWindow.label_5.setText("File Created")
## Plan to use QLabel to show image in future          
#pixmap = QtGui.QPixmap("path of Image")   
#self.label_5.setPixmap(pixmap) 
event_handler = MyHandler()
observer = Observer()
observer.schedule(event_handler, path, recursive=True)
observer.start()

问题的原因是on_created是在次要线程中调用的,Qt不允许从主线程以外的另一个线程更新GUI,因为它的元素不是线程安全的。解决方案是使用信号:

from PySide2 import QtCore, QtWidgets
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler, FileSystemEvent

class Bridge(QtCore.QObject):
created = QtCore.Signal(FileSystemEvent)

class Handler(FileSystemEventHandler):
def __init__(self):
super().__init__()
self.bridge = Bridge()
def on_created(self, event):
self.bridge.created.emit(event)

class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.label = QtWidgets.QLabel(alignment=QtCore.Qt.AlignCenter)
self.setCentralWidget(self.label)
def handle_created(self, event):
self.label.setText(f"created {event.src_path}")
print(event.event_type)

def main():
app = QtWidgets.QApplication()
path = "/path/of/directory"
mainwindow = MainWindow()
mainwindow.resize(640, 480)
mainwindow.show()
handler = Handler()
handler.bridge.created.connect(mainwindow.handle_created)
observer = Observer()
observer.schedule(handler, path, recursive=True)
observer.start()
app.exec_()

if __name__ == "__main__":
main()

最新更新