def closeEvent(self, event):
self.myThread.terminate()
self.myThread.wait()
if self.myThrad.isFinished():
del self.myThread
这样就完成了在关闭子窗口时,同时结束子窗口中启用的子线程了。
PyQt5-子窗口关闭时,强制关闭子线程目的:为解决 在多窗口调用过程中,由于在子窗口中启用了线程处理任务,当关闭子窗口后,线程没有关闭的问题。参考pyqt使用手册:调用terminate()这个方法可强制关闭当前线程具体代码如下:import QThread# 重新线程,在run()函数中以打印数字模拟耗时任务class MyThread(QThread): def __init__(self): super().__init__() def run(s
问题描述:
在主窗口初始化过程中开启新线程socket,socket线程中又开启子线程与客户端socket通信,关闭主窗口时总是不能退出所有线程(客户端是单独开启一个子进程)。
解决方案:
搜了一下网上的,主要是设置守护进程、重写关闭函数等:
设置守护进程:setDaemon(True),这个方法有效果,语句要写在线程start之前:
self.your_thread = threading.Thread(target=self.fun, args=(arg1, arg2))
# 设置线程为守护
Timer 一般会设置一个间隔时间,然后才开一个子线程执行需要执行的函数。
cancel() 函数只能取消还未开始执行的 Timer,也就是取消该 Timer。如果 Timer 已经开启子线程执行函数了,用 cancel() 函数 是不能停止子线程执行的,子线程会一直执行,直到结束。
使用下面这个函数强制停止子线程:
import ctypes
import datetime
import inspect
def stop_thread(thread):
tid = thread.ident
提示:图形界面启动、点击运行如果执行的代码需要长时间才能够执行完成,会导致图形界面卡死状态,这种情况下需要采用线程或者进程处理。
当前demo引用线程后台运行模块进行维护。
一、公共子界面基类
class WDTBaseQWidget(QWidget):
isBackRun= False
backRunData= {}
def toClose(self) -&g..
关闭主窗口会导致所有的子窗口一起关闭,因此需要在子窗口的关闭事件中处理主窗口的关闭事件。可以在子窗口类的关闭事件中使用`QApplication.instance().quit()`关闭应用程序。具体实现代码如下:
```python
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QPushButton
class ChildWindow(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle('Child Window')
self.resize(200, 100)
def closeEvent(self, event):
# 关闭主窗口
QApplication.instance().quit()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('Main Window')
self.resize(400, 300)
self.btn = QPushButton('Open Child Window', self)
self.btn.clicked.connect(self.open_child_window)
def open_child_window(self):
child = ChildWindow(self)
child.show()
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
在上面的例子中,子窗口类`ChildWindow`重写了`closeEvent`方法,在关闭子窗口时会触发该方法,从而关闭主窗口。在主窗口类`MainWindow`中,点击按钮会打开一个子窗口。