非常抱歉,之前的回答中使用的是 PyQt5 的示例代码。如果你使用的是 PySide2,可以按照以下方式实现线程和界面之间的通信:
from PySide2.QtCore import QObject, Signal, QThread
class Worker(QObject):
finished = Signal() # 自定义信号,用于通知界面线程完成工作
def __init__(self, file_type, file_path):
super().__init__()
self.File_Type = file_type
self.File_Path = file_path
def run(self):
if self.File_Type == 'xls':
file_name = "123.xls"
# 拼接文件路径
file_path = os.path.join(self.File_Path, file_name)
Exclud_Book = xlrd.open_workbook(file_path)
else:
file_name = "123.xlsx"
# 拼接文件路径
file_path = os.path.join(self.File_Path, file_name)
Exclud_Book = load_workbook(file_path)
# 进行其他耗时操作
# ...
self.finished.emit() # 发射信号,通知界面线程任务完成
在 `Worker` 类中,我们定义了一个 `finished` 信号并继承自 `QObject`,这样我们就可以在其中定义和发射信号。在 `run` 方法中,你可以进行耗时的操作,例如打开和处理 Excel 文件。当任务完成后,我们发射 `finished` 信号。
接下来,在 `WindowB` 类中的 `start_thread` 方法中,连接了 `Worker` 对象的 `finished` 信号到槽函数 `thread_finished`:
class WindowB(BaseWindow):
def __init__(self):
super().__init__()
self.textEdit_5 = QTextEdit(self)
self.pushButton_3 = QPushButton("Start", self)
self.pushButton_3.clicked.connect(self.start_thread)
def start_thread(self):
self.textEdit_5.setReadOnly(True) # 在开始线程前禁用控件
file_type = 'xls' # 假设这是你的文件类型
file_path = 'path/to/file' # 假设这是你的文件路径
self.worker = Worker(file_type, file_path)
self.worker.finished.connect(self.thread_finished)
self.thread = QThread()
self.worker.moveToThread(self.thread)
self.thread.started.connect(self.worker.run)
self.thread.finished.connect(self.thread.deleteLater) # 线程结束后自动删除
self.thread.finished.connect(self.worker.deleteLater) # 工作对象结束后自动删除
self.thread.finished.connect(self.thread_finished) # 线程结束后执行线程结束处理
self.thread.start()
def thread_finished(self):
self.textEdit_5.setReadOnly(False) # 线程结束后启用控件
在 `start_thread` 方法中,创建了一个 `Worker` 类的实例 `worker`,并将其 `finished` 信号连接到 `thread_finished` 槽函数。然后,创建了一个 `QThread` 实例 `thread`,并将 `worker` 移动到 `thread` 中执行。
最后,我们连接了 `thread` 的 `started` 信号到 `worker` 的 `run` 方法,连接了 `thread` 的 `finished` 信号到一些清理操作,并连接了 `thread` 的 `finished` 信号到 `thread_finished` 槽函数。
当点击按钮触发 `start_thread` 方法时,`textEdit_5` 控件将被禁用。然后,工作线程会在独立的线程中执行耗时任务,在任务完成后发射 `finished` 信号。最终,`thread_finished` 槽函数会被调用,你可以在其中进行界面的相关操作,例如启用 `textEdit_5` 控件。
请注意,这里的示例代码是使用 PySide2 实现的。如果你使用的是 PyQt5,你需要相应地导入和使用 PyQt5 的类和模块。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |