将数据写入QTextEdit时,关闭窗口时显示错误

时间:2019-07-17 07:08:58

标签: python pyqt pyqt5 qtextedit

我正在编写pyqt5演示程序,同时在计时器事件中将数据写入QTextEdit,当关闭窗口时,它显示错误

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)**

1 个答案:

答案 0 :(得分:0)

我建议在终端/ 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()需要一个参数,在这种情况下,它是与计时器关联的ID,因为您可以启动多个计时器,而只想停止一个计时器,该ID将由{{ 3}}方法。

考虑上述解决方案是:

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())