python - PyCharm 关闭后仍然显示正在运行的脚本

标签 python qt pycharm pyqt5

我今天注意到一个Python script在我的 Windows 10 上的 PyCharm 2020.2 IDE 中运行时,当我单击 X 退出时,主窗口消失,但 PyCharm 仍显示其正在运行的脚本的图标。在 PyCharm 中明确终止脚本后,会出现以下错误消息。

Process finished with exit code -1

当我的 PyCarm IDE 中的脚本在 Linux (Ubuntu) 上执行时,PyCharm 在单击 X 退出主窗口后不显示正在运行的脚本的图标。

为什么会这样?

代码

import sys
from datetime import datetime
import pythoncom

import wmi

from PyQt5. QtCore import QObject, QRunnable, QThreadPool, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QHeaderView


class KeyboardDetectorSignals(QObject):
    keyboard_changed = pyqtSignal(str)


class KeyboardDetector(QRunnable):

    def __init__(self):
        super().__init__()

        self.signals = KeyboardDetectorSignals()

    def run(self):
        pythoncom.CoInitialize()
        device_connected_wql = "SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA \'Win32_Keyboard\'"
        device_disconnected_wql = "SELECT * FROM __InstanceDeletionEvent WITHIN 2 WHERE TargetInstance ISA \'Win32_Keyboard\'"

        c = wmi.WMI()
        connected_watcher = c.watch_for(raw_wql=device_connected_wql)
        disconnected_watcher = c.watch_for(raw_wql=device_disconnected_wql)

        while True:
            try:
                connected = connected_watcher(timeout_ms=10)
            except wmi.x_wmi_timed_out:
                pass
            else:
                if connected:
                    self.signals.keyboard_changed.emit("Keyboard connected.")

            try:
                disconnected = disconnected_watcher(timeout_ms=10)
            except wmi.x_wmi_timed_out:
                pass
            else:
                if disconnected:
                    self.signals.keyboard_changed.emit("Keyboard disconnected.")


class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()

        self.setGeometry(100, 100, 500, 500)
        self.setWindowTitle("Keyboard Logger")

        self.log_table = QTableWidget()
        self.log_table.setColumnCount(2)
        self.log_table.setShowGrid(True)
        self.log_table.setHorizontalHeaderLabels(["Time", "Event"])
        self.log_table.horizontalHeader().setStretchLastSection(True)
        self.log_table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
        self.setCentralWidget(self.log_table)
        self.show()

        self.threadpool = QThreadPool()
        keyboard_detector = KeyboardDetector()
        keyboard_detector.signals.keyboard_changed.connect(self.add_row)
        self.threadpool.start(keyboard_detector)

    def add_row(self, event: str):
        now = datetime.now()
        datetime_string = now.strftime("%Y-%m-%d %H:%M:%S")

        row_count = self.log_table.rowCount()
        self.log_table.insertRow(row_count)
        self.log_table.setItem(row_count, 0, QTableWidgetItem(datetime_string))
        self.log_table.setItem(row_count, 1, QTableWidgetItem(event))


def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

最佳答案

请注意,Process finished with exit code -1 不是错误,它只是意味着您的程序已终止。

关于python - PyCharm 关闭后仍然显示正在运行的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63801951/

相关文章:

c++ - 如何让 Qt Creator 在 Mac M1 上使用 Rosetta 和 x86 编译器?

linux - 更改默认的PyCharm图标

python - os.chdir 工作一次,第二次调用后不工作; python 脚本

python - 如何从产品名称中提取品牌

Python SVG 转换器创建空文件

c++ - Q3DBars 仅在一个角上带有垂直标签,可能吗?

c++ - Qt 安装程序框架 : strange license error when updating

python - 如何在 PyCharm 中删除项目?

python - 如何为包含整数的列表提取字符串?

python - redshift 连接的粘合作业 : "Unable to find suitable security group"