Python Qt Guid简单的shell窗口打印结果

时间:2014-01-04 22:10:34

标签: python qt pyside

我第一次尝试使用Pyside和QT创建GUID。

我查看了一些教程并在下面创建了这个尝试。

我正在尝试创建某种窗口来打印脚本找到的内容,因此它不是使用python shell窗口,而是在我创建的这个新窗口中打印。该应用程序运行并创建GUID,底部午餐脚本,但现在是我被卡住的地方。

应用程序冻结,直到脚本运行到最后,而不是在循环结束时打印结果。

这是代码:

import sys
import PySide
from PySide.QtCore import *
from PySide.QtGui import *
import time

class Form(QDialog):
    def __init__(self,parent=None):
        super(Form, self).__init__(parent)

        self.browser = QTextBrowser()
        lable = QLabel("Print Window:")
        self.botton = QPushButton('Start Search')

        self.botton.setMaximumWidth(150)

        layout = QVBoxLayout()
        layout.addWidget(lable)
        layout.addWidget(self.browser)
        layout.addWidget(self.botton)
        self.setLayout(layout)
        self.setWindowTitle("Test App")
        self.setMinimumWidth(650)

        self.connect(self.botton, SIGNAL('clicked()'), self.run)


    def run(self):
        TestList = ['loop 1','loop 2','loop 3','loop 4','loop 5']
        for i in TestList:
            self.browser.append(i)
            time.sleep(1)


app = QApplication(sys.argv)
form = Form()
form.show()
app.exec_()

我自己一直在学习python几周,主要感谢这个网站,我已经设法学到了很多并创建了一些应用程序。

希望有人可以帮我解决这个问题,我似乎无法弄明白。 非常感谢

1 个答案:

答案 0 :(得分:0)

原因是因为你在这里有一个阻塞循环:

def run(self):
    TestList = ['loop 1','loop 2','loop 3','loop 4','loop 5']
    for i in TestList:
        self.browser.append(i)
        time.sleep(1)

这意味着,主Qt事件循环无法通过常规事件处理您的追加请求。此问题的常见解决方案是在Qt中使用以下方法:

  

void QCoreApplication::processEvents(QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents) [static]

     

根据指定的标志处理调用线程的所有挂起事件,直到没有其他事件要处理。

     

当程序忙于执行长时间操作(例如复制文件)时,您可以偶尔调用此功能。

     

如果您正在运行一个连续调用此函数的本地循环,而没有事件循环,则不会处理DeferredDelete事件。这可能会影响窗口小部件的行为,例如QToolTip,依赖DeferredDelete事件正常运行。另一种方法是从该本地循环中调用sendPostedEvents()。

     

调用此函数仅处理调用线程的事件

这意味着,你会写这样的东西:

...
def run(self):
    TestList = ['loop 1','loop 2','loop 3','loop 4','loop 5']
    for i in TestList:
        self.browser.append(i)
        QCoreApplication.processEvents()
        time.sleep(1)
...