将数据写入 QTextEdit 时,关闭 window 时显示错误
while write data to QTextEdit, when close window, it show error
我正在编写一个 pyqt5 演示,同时在定时器事件中将数据写入 QTextEdit,当关闭 window 时,它显示错误
from PyQt5.QtSerialPort import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.msgTE = QTextEdit()
self.msgTE.setReadOnly(True)
layout = QGridLayout()
layout.addWidget(self.msgTE, 0, 0, 1, 2)
widget = QWidget()
widget.setLayout(layout)
self.setCentralWidget(widget)
self.startTimer(10)
def timerEvent(self, *event):
QApplication.processEvents()
self.msgTE.insertPlainText('12')
def closeEvent(self, *args, **kwargs):
self.killTimer()
app = QApplication(sys.argv)
demo = MainWindow()
demo.show()
app.exec()
** 输出:进程完成,退出代码为 -1073740791 (0xC0000409)**
我建议在 terminal/CMD 中执行脚本,因为许多 IDE 不处理 Qt 异常,如果你这样做,那么你应该获得以下内容:
Traceback (most recent call last):
File "main.py", line 34, in closeEvent
self.killTimer()
TypeError: killTimer(self, int): not enough arguments
这告诉我们 killTimer()
expects an argument, in this case it is the id associated with the timer since you can start several timers and you only want to stop one, that id is to return by the startTimer()
方法。
考虑到上面的解决方案是:
from PyQt5 import QtWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.msgTE = QtWidgets.QTextEdit(readOnly=True)
widget = QtWidgets.QWidget()
layout = QtWidgets.QGridLayout(widget)
layout.addWidget(self.msgTE, 0, 0)
self.setCentralWidget(widget)
self.m_timer_id = self.startTimer(10)
def timerEvent(self, event):
if event.timerId() == self.m_timer_id:
self.msgTE.insertPlainText("12")
super().timerEvent(event)
def closeEvent(self, event):
self.killTimer(self.m_timer_id)
super().closeEvent(event)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
demo = MainWindow()
demo.show()
sys.exit(app.exec())
我正在编写一个 pyqt5 演示,同时在定时器事件中将数据写入 QTextEdit,当关闭 window 时,它显示错误
from PyQt5.QtSerialPort import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.msgTE = QTextEdit()
self.msgTE.setReadOnly(True)
layout = QGridLayout()
layout.addWidget(self.msgTE, 0, 0, 1, 2)
widget = QWidget()
widget.setLayout(layout)
self.setCentralWidget(widget)
self.startTimer(10)
def timerEvent(self, *event):
QApplication.processEvents()
self.msgTE.insertPlainText('12')
def closeEvent(self, *args, **kwargs):
self.killTimer()
app = QApplication(sys.argv)
demo = MainWindow()
demo.show()
app.exec()
** 输出:进程完成,退出代码为 -1073740791 (0xC0000409)**
我建议在 terminal/CMD 中执行脚本,因为许多 IDE 不处理 Qt 异常,如果你这样做,那么你应该获得以下内容:
Traceback (most recent call last):
File "main.py", line 34, in closeEvent
self.killTimer()
TypeError: killTimer(self, int): not enough arguments
这告诉我们 killTimer()
expects an argument, in this case it is the id associated with the timer since you can start several timers and you only want to stop one, that id is to return by the startTimer()
方法。
考虑到上面的解决方案是:
from PyQt5 import QtWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.msgTE = QtWidgets.QTextEdit(readOnly=True)
widget = QtWidgets.QWidget()
layout = QtWidgets.QGridLayout(widget)
layout.addWidget(self.msgTE, 0, 0)
self.setCentralWidget(widget)
self.m_timer_id = self.startTimer(10)
def timerEvent(self, event):
if event.timerId() == self.m_timer_id:
self.msgTE.insertPlainText("12")
super().timerEvent(event)
def closeEvent(self, event):
self.killTimer(self.m_timer_id)
super().closeEvent(event)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
demo = MainWindow()
demo.show()
sys.exit(app.exec())