Python 延迟执行默认焦点中QPushButton的FocusIn()事件,直到GUI内容呈现
我有一个PyQt5 GUI应用程序,有两个按钮(“读”和“写”)。当一个按钮聚焦时,我想打印一个单词(“读”或“写”)1000000次。但是使用默认焦点时,焦点事件会触发第一个按钮(在本例中为“读取”),并在GUI呈现内容之前打印“读取”1000000次。我可以让应用程序在呈现GUI内容后触发focusIn()事件吗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
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_()
希望有帮助。我想到了这个主意。非常感谢,我知道了。非常感谢你。