2016-03-01 17 views
1

我正在python中使用PyQt4构建应用程序。我想添加一个背景计时器到我的应用程序,以便当计时器用完时,我的应用程序中的文本编辑器停止接收输入并冻结。 我曾尝试以下方法至今:PyQt中的后台计时器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_()) 

但每当我运行此应用程序停止响应。我也尝试通过线程运行计时器,但在这种情况下,应用程序也会停止响应。

我该如何实现此功能?

P.S. - 我是PyQt的初学者。

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

    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") 

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

+0

请张贴您的'类主'代码。 – DreyFax

回答

1

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

使用QTimer与信号插槽

Signals and Slots (wikipedia)

对于PyQt的使用信号和槽看到this

定时器初始化为持续时间和信号时隙连接。在调用app.exec_()之后,它将等待input_timer信号timeout。如果发生这种情况,事件循环将调用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() 
+0

它不工作。编辑后我再次尝试,但应用程序仍然崩溃。 –

相关问题