PySide编程中的QTimer与time.sleep

时间:2014-09-16 11:34:03

标签: python pyside

这是一个使用PySide的简单gui计时器:

#!/usr/bin/env python3

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

app = QApplication(sys.argv)

try:
    message = """
    <pre>
    Alert! Alert! Alert!
    Alert! Alert! Alert!
    Alert! Alert! Alert!
    Alert! Alert! Alert!
    Alert! Alert! Alert!
    Alert! Alert! Alert!
    </pre>
    """

    now = QTime.currentTime()
    due = now.addSecs(2)

    if not due.isValid():
        raise ValueError

    dueMs = now.msecsTo(due)

except:
    pass


label = QLabel("<b>" + message + "</b>")
label.setWindowFlags(Qt.SplashScreen)
QTimer.singleShot(dueMs, label.show)
QTimer.singleShot(3000, app.quit)
app.exec_()

这是另一个同样有效的版本:

#!/usr/bin/env python3

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

app = QApplication(sys.argv)

try:
    message = """
    <pre>
    Alert! Alert! Alert!
    Alert! Alert! Alert!
    Alert! Alert! Alert!
    Alert! Alert! Alert!
    Alert! Alert! Alert!
    Alert! Alert! Alert!
    </pre>
    """

    now = QTime.currentTime()
    due = now.addSecs(2)

    if not due.isValid():
        raise ValueError


except:
    pass

while QTime.currentTime() < due:
    time.sleep(0.2)

label = QLabel("<b>" + message + "</b>")
label.setWindowFlags(Qt.SplashScreen)
label.show()
QTimer.singleShot(3000, app.quit)
app.exec_()

不同之处在于第二个版本使用time.sleep,而第一个版本使用QTimer.singleShot作为时间。其中一个是否优先于另一个?如果是这样,为什么?

1 个答案:

答案 0 :(得分:0)

  

其中一个是否优先于另一个?如果是这样,为什么?

回答:说出对错是很难的。我的意见,为了您的应用程序的使用目的。


让我们说,情况:&#34;开始前加载数据&#34;

您必须将大量数据加载到主应用程序中。完成加载需要很长时间。关键是你在开始之前完成了负载。所以在你的second version中使用它应该是好的。但是如果你不等待这个延迟,你应该创建线程来加载数据并触发你的标签直到完成加载。和first version一样(看起来就像QThread一样)。

在其他情况下:&#34;在应用程序中保存数据&#34;

您必须将主应用程序中的海量数据保存到文件中。编写文件需要时间。如果您使用first version。当用户尝试保存时,应用程序将启动以保存文件。保存完成之前,您的应用程序无法执行任何操作(例如Ubuntu中的黑色透明屏幕,挂起或冻结)。但是如果使用second version,则必须在开始保存,取消和完成保存文件时进行处理。对应用程序的响应非常困难但很好。