Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 延迟执行默认焦点中QPushButton的FocusIn()事件,直到GUI内容呈现_Python_Python 3.x_Pyqt5 - Fatal编程技术网

Python 延迟执行默认焦点中QPushButton的FocusIn()事件,直到GUI内容呈现

Python 延迟执行默认焦点中QPushButton的FocusIn()事件,直到GUI内容呈现,python,python-3.x,pyqt5,Python,Python 3.x,Pyqt5,我有一个PyQt5 GUI应用程序,有两个按钮(“读”和“写”)。当一个按钮聚焦时,我想打印一个单词(“读”或“写”)1000000次。但是使用默认焦点时,焦点事件会触发第一个按钮(在本例中为“读取”),并在GUI呈现内容之前打印“读取”1000000次。我可以让应用程序在呈现GUI内容后触发focusIn()事件吗 from PyQt5 import QtCore, QtWidgets import sys class Start_Gui(QtWidgets.QWidget): de

我有一个PyQt5 GUI应用程序,有两个按钮(“读”和“写”)。当一个按钮聚焦时,我想打印一个单词(“读”或“写”)1000000次。但是使用默认焦点时,焦点事件会触发第一个按钮(在本例中为“读取”),并在GUI呈现内容之前打印“读取”1000000次。我可以让应用程序在呈现GUI内容后触发focusIn()事件吗

from PyQt5 import QtCore, QtWidgets
import sys

class Start_Gui(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Start_Gui, self).__init__(parent)
        self.setGeometry(200, 100, 500, 250)
        self.setWindowTitle("hi")

        self.button1 = QtWidgets.QPushButton("read", self)
        self.button2 = QtWidgets.QPushButton("write", self)

        self.button1.move(100, 50)
        self.button2.move(100, 100)

        for button in (self.button1, self.button2):
            button.installEventFilter(self)

    def eventFilter(self, obj, event):
        if event.type() == QtCore.QEvent.FocusIn:
            if self.button1 is obj:
                self.instruct('read')
            elif self.button2 is obj:
                self.instruct('write')

        return super(Start_Gui, self).eventFilter(obj, event)

    def instruct(self, type):
        if type == 'read':
            for i in range(1000000):
                print("read")
        if type == 'write':
            for i in range(1000000):
                print("write")

gui_app = QtWidgets.QApplication(sys.argv)
gui = Start_Gui()
gui.show()
gui_app.exec_()

有人能帮忙吗?

您需要启动新线程,我不知道您的确切要求,但这里有一个示例:

from PyQt5.QtCore import QObject, pyqtSignal

from PyQt5 import QtCore, QtWidgets
import sys

class Start_Gui(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Start_Gui, self).__init__(parent)
        self.setGeometry(200, 100, 500, 250)
        self.setWindowTitle("hi")

        self.button1 = QtWidgets.QPushButton("read", self)
        self.button2 = QtWidgets.QPushButton("write", self)

        self.button1.move(100, 50)
        self.button2.move(100, 100)

        self.readWorkerThread = None
        self.writeWorkerThread = None
        self.readWorker = None
        self.writeWorker = None

        for button in (self.button1, self.button2):
            button.installEventFilter(self)

    def eventFilter(self, obj, event):
        if event.type() == QtCore.QEvent.FocusIn:
            if self.button1 is obj:
                self._instructRead()
            elif self.button2 is obj:
                self._instructWrite()

        return super().eventFilter(obj, event)

    def _instructRead(self):
        if self.readWorkerThread and self.readWorkerThread.isRunning():
            print('read thread is already running.')
            return

        self.readWorker = InstructWorker('read', 100000)
        self.readWorkerThread = QtCore.QThread()
        self.readWorker.moveToThread(self.readWorkerThread)
        self.readWorkerThread.started.connect(self.readWorker.run)
        self.readWorkerThread.start()

    def _instructWrite(self):
        if self.writeWorkerThread and self.writeWorkerThread.isRunning():
            print('write thread is already running.')
            return

        self.writeWorker = InstructWorker('write', 100000)
        self.writeWorkerThread = QtCore.QThread()
        self.writeWorker.moveToThread(self.writeWorkerThread)
        self.writeWorkerThread.started.connect(self.writeWorker.run)
        self.writeWorkerThread.start()


class InstructWorker(QObject):
    reportProgress = pyqtSignal(int, int)

    def __init__(self, instructType, instructNum):
        super().__init__()

        self._instructType = instructType
        self._instructNum = instructNum

    def run(self):
        self._instruct()

    def _instruct(self):
        for i in range(self._instructNum):
            print('{} {}'.format(self._instructType, i))
            self.reportProgress.emit(i, self._instructNum)
        self.thread().terminate()


gui_app = QtWidgets.QApplication(sys.argv)
gui = Start_Gui()
gui.show()
gui_app.exec_()

希望有帮助。

您需要启动新线程,我不知道您的确切要求,但这里有一个示例:

from PyQt5.QtCore import QObject, pyqtSignal

from PyQt5 import QtCore, QtWidgets
import sys

class Start_Gui(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Start_Gui, self).__init__(parent)
        self.setGeometry(200, 100, 500, 250)
        self.setWindowTitle("hi")

        self.button1 = QtWidgets.QPushButton("read", self)
        self.button2 = QtWidgets.QPushButton("write", self)

        self.button1.move(100, 50)
        self.button2.move(100, 100)

        self.readWorkerThread = None
        self.writeWorkerThread = None
        self.readWorker = None
        self.writeWorker = None

        for button in (self.button1, self.button2):
            button.installEventFilter(self)

    def eventFilter(self, obj, event):
        if event.type() == QtCore.QEvent.FocusIn:
            if self.button1 is obj:
                self._instructRead()
            elif self.button2 is obj:
                self._instructWrite()

        return super().eventFilter(obj, event)

    def _instructRead(self):
        if self.readWorkerThread and self.readWorkerThread.isRunning():
            print('read thread is already running.')
            return

        self.readWorker = InstructWorker('read', 100000)
        self.readWorkerThread = QtCore.QThread()
        self.readWorker.moveToThread(self.readWorkerThread)
        self.readWorkerThread.started.connect(self.readWorker.run)
        self.readWorkerThread.start()

    def _instructWrite(self):
        if self.writeWorkerThread and self.writeWorkerThread.isRunning():
            print('write thread is already running.')
            return

        self.writeWorker = InstructWorker('write', 100000)
        self.writeWorkerThread = QtCore.QThread()
        self.writeWorker.moveToThread(self.writeWorkerThread)
        self.writeWorkerThread.started.connect(self.writeWorker.run)
        self.writeWorkerThread.start()


class InstructWorker(QObject):
    reportProgress = pyqtSignal(int, int)

    def __init__(self, instructType, instructNum):
        super().__init__()

        self._instructType = instructType
        self._instructNum = instructNum

    def run(self):
        self._instruct()

    def _instruct(self):
        for i in range(self._instructNum):
            print('{} {}'.format(self._instructType, i))
            self.reportProgress.emit(i, self._instructNum)
        self.thread().terminate()


gui_app = QtWidgets.QApplication(sys.argv)
gui = Start_Gui()
gui.show()
gui_app.exec_()

希望有帮助。

我想到了这个主意。非常感谢,我知道了。非常感谢你。