我第一次尝试使用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几周,主要感谢这个网站,我已经设法学到了很多并创建了一些应用程序。
希望有人可以帮我解决这个问题,我似乎无法弄明白。 非常感谢
答案 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中使用以下方法:
根据指定的标志处理调用线程的所有挂起事件,直到没有其他事件要处理。
当程序忙于执行长时间操作(例如复制文件)时,您可以偶尔调用此功能。
如果您正在运行一个连续调用此函数的本地循环,而没有事件循环,则不会处理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)
...