PyQt-Python应用程序中的后台计时器

PyQt-Python应用程序中的后台计时器,python,timer,pyqt4,Python,Timer,Pyqt4,我正在使用PyQt4用python构建一个应用程序。我想在我的应用程序中添加一个后台计时器,这样当计时器用完时,我的应用程序中的文本编辑器将停止接收输入并冻结。 到目前为止,我已经尝试了以下方法: def main(): app = QtGui.QApplication(sys.argv) main = Main() main.show() start = time.time() #this loop is for the time interval

我正在使用PyQt4用python构建一个应用程序。我想在我的应用程序中添加一个后台计时器,这样当计时器用完时,我的应用程序中的文本编辑器将停止接收输入并冻结。 到目前为止,我已经尝试了以下方法:

def main():
    app = QtGui.QApplication(sys.argv)
    main = Main()
    main.show()  
    start = time.time()
    #this loop is for the time interval within which the text area of
    #the editor will accept inputs.   
    while time.time() - start < 120:
        pass
    #this will set the text area to a read only state after and will not
    #any more inputs.    
    main.text.setReadOnly(True)
    sys.exit(app.exec_())

这是主类代码的淡化版本。希望这有帮助。

您的应用程序没有响应,因为您正在阻止事件处理程序。它由app.exec()处理。。此调用仅检查事件并在无限循环中处理这些事件

将QTimer与信号插槽一起使用

有关在pyqt中使用信号和插槽的信息,请参阅

定时器通过持续时间和信号插槽连接进行初始化。调用
app.exec()
后,它将等待
input\u计时器
信号
超时
。如果引发此问题,事件循环将调用lambda函数,该函数将禁用文本框,因为它连接到信号

def main():
    app = QtGui.QApplication(sys.argv)
    main = Main()
    main.show()  

    input_timer = QTimer(self)
    input_timer.timeout.connect(lambda : main.text.setReadOnly(True))
    input_timer.setSingleShot(True)
    input_timer.start(2000)

    sys.exit(app.exec_())
这将在2000毫秒后禁用文本框。根据需要进行调整。我会将计时器和行为移至
Main

import sys
from PyQt4 import QtCore, QtGui

class Main(QtGui.QMainWindow):
    def __init__(self,parent = None):
        QtGui.QMainWindow.__init__(self,parent)
        self.init_ui()

        self.disable_edit_text_timer = QtCore.QTimer(self)
        self.disable_edit_text_timer.timeout.connect(self.disable_edit_text)
        self.disable_edit_text_timer.setSingleShot(True)
        self.disable_edit_text_timer.start(2000)

    def init_ui(self):
        self.text = QtGui.QTextEdit(self)
        self.setCentralWidget(self.text)
        self.statusbar = self.statusBar()        
        self.setGeometry(100,100,1080,720)
        self.setWindowTitle("Text Editor")

    def disable_edit_text(self):
        self.text.setReadOnly(True)

def main():
    app = QtGui.QApplication(sys.argv)
    main = Main()
    main.show()  

    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

它不起作用。我在您编辑后再次尝试,但应用程序仍然崩溃。请发布您的
class Main
代码。
import sys
from PyQt4 import QtCore, QtGui

class Main(QtGui.QMainWindow):
    def __init__(self,parent = None):
        QtGui.QMainWindow.__init__(self,parent)
        self.init_ui()

        self.disable_edit_text_timer = QtCore.QTimer(self)
        self.disable_edit_text_timer.timeout.connect(self.disable_edit_text)
        self.disable_edit_text_timer.setSingleShot(True)
        self.disable_edit_text_timer.start(2000)

    def init_ui(self):
        self.text = QtGui.QTextEdit(self)
        self.setCentralWidget(self.text)
        self.statusbar = self.statusBar()        
        self.setGeometry(100,100,1080,720)
        self.setWindowTitle("Text Editor")

    def disable_edit_text(self):
        self.text.setReadOnly(True)

def main():
    app = QtGui.QApplication(sys.argv)
    main = Main()
    main.show()  

    sys.exit(app.exec_())

if __name__ == "__main__":
    main()