Python&Pyqt5:在检查文件时防止“ GUI冻结”

问题描述 投票:0回答:1

我正在尝试在pyqt5中构建文件侦听器应用程序。我的代码可以按我的意愿工作,但我想对其进行改进。

有一个简单的按钮Listen。当我单击它时,它会打开一个记事本,并开始一直监听直到a.txt文件存在。存在后,存在新按钮Start,旧按钮被删除。

我的问题是;我的GUI在监听a.txt文件甚至我使用threading时冻结。我使用错了吗?您可以修复我的代码吗?

我的主要代码;

from PyQt5 import QtCore, QtWidgets
import sys
import os

class ListenWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(ListenWindow, self).__init__(parent)
        self.setWindowTitle("Listen")

        self.button_listen = QtWidgets.QPushButton('Listen', self)
        font1 = self.button_listen.font()
        font1.setPointSize(10)
        self.button_listen.setFont(font1)
        self.button_listen.setFixedSize(200, 50)
        self.button_listen.clicked.connect(self.startToListen)

        self.v_box1 = QtWidgets.QVBoxLayout(self)
        self.v_box1.addWidget(self.button_listen)

        self.h_box1 = QtWidgets.QHBoxLayout(self)
        self.v_box1.addLayout(self.h_box1)

    def abc(self):
        while not os.path.exists('C:/Users/Wicaledon/PycharmProjects/myproject/a.txt'):
            pass

        if os.path.isfile('C:/Users/Wicaledon/PycharmProjects/myproject/a.txt'):
            self.button_start = QtWidgets.QPushButton('Start', self)
            font2 = self.button_start.font()
            font2.setPointSize(10)
            self.button_start.setFont(font2)
            self.button_start.setFixedSize(200, 50)
            self.h_box1.addWidget(self.button_start, 0, QtCore.Qt.AlignCenter)
        else:
            raise ValueError("%s isn't a file!" % 'C:/Users/Wicaledon/PycharmProjects/myproject/a.txt')
        self.v_box1.removeWidget(self.button_listen)

    def startToListen(self):
        def thread_function(my_text):
            import subprocess
            import os
            FNULL = open(os.devnull, 'w')
            args = my_text
            subprocess.call(args, stdout=FNULL, stderr=FNULL, shell=True)
            # os.system(my_text)
            return
        import threading
        my_text = "notepad"
        x = threading.Thread(target=thread_function,args=(my_text,))
        x.start()
        y = threading.Thread(target=ListenWindow.abc(self))
        y.start()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = ListenWindow()
    window.setWindowTitle('Login')
    window.show()
    sys.exit(app.exec_())

我的用于创建a.txt的代码;

f=open("a.txt", "w+")
f.write("delete_me")
f.close()
python python-3.x multithreading pyqt5 qthread
1个回答
0
投票

while功能中的abc循环更改为

        while not os.path.exists('b.txt'):
            QtCore.QCoreApplication.processEvents()
            pass
© www.soinside.com 2019 - 2024. All rights reserved.