鉴于此,我从PyQt5模块开始,我仍在慢慢了解其背后的逻辑。就是说,我有一个我找不到答案的问题,希望您能为我提供帮助。
我有这个脚本:
import sys, socket, time
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from io import BytesIO as by
class loadGame(QWidget):
wLoadDisplay = 768
hLoadDisplay = 576
wLoadBar = 650
hLoadBar = 40
pbarCSS = """
QProgressBar
{
font-size: 20px;
font-weight: bold;
background-color: #FFF;
border: 4px solid #000;
text-align: center;
}
QProgressBar::chunk
{
background-color: #FF0000;
width: 1px;
}
"""
labelCSS = """
QLabel
{
font-size: 20px;
font-weight: bold;
background-color: #FFF;
border: 4px solid #000;
}
"""
fileResource = []
imgResource = []
vidResource = []
audResource = []
diaResource = []
txtResource = []
internetConnection = False
def __init__(self, *args, **kwargs):
QWidget.__init__(self, *args, **kwargs)
self.outputFile = by()
self.pbar = QProgressBar(self)
self.pbar.setGeometry((self.wLoadDisplay / 2 - self.wLoadBar / 2), (self.hLoadDisplay / 2 - self.hLoadBar * 2),
self.wLoadBar, self.hLoadBar)
self.pbar.setFormat("%v/%m")
self.pbar.setValue(0)
self.pbar.setStyleSheet(self.pbarCSS)
self.label = QLabel(self)
self.label.setGeometry((self.wLoadDisplay / 2 - self.wLoadBar / 2), (self.hLoadDisplay / 2),
self.wLoadBar, self.hLoadBar)
self.label.setAlignment(Qt.AlignCenter | Qt.AlignVCenter)
self.label.setStyleSheet(self.labelCSS)
self.setGeometry(0, 0, self.wLoadDisplay, self.hLoadDisplay)
oImage = QImage("bgloading.png")
sImage = oImage.scaled(QSize(self.wLoadDisplay, self.hLoadDisplay))
palette = QPalette()
palette.setBrush(10, QBrush(sImage))
self.setPalette(palette)
qtRectangle = self.frameGeometry()
centerPoint = QDesktopWidget().availableGeometry().center()
qtRectangle.moveCenter(centerPoint)
self.move(qtRectangle.topLeft())
self.run()
def run(self):
self.checkConnection()
if self.internetConnection:
self.checkUpdate()
else:
pass
def checkConnection(self):
self.objectChange("Check Internet Connection", 1)
try:
host = socket.gethostbyname("www.google.it")
s = socket.create_connection((host, 80), 2)
self.internetConnection = True
except:
pass
self.count()
self.reset()
def checkUpdate(self):
pass
def objectChange(self, object, n):
self.label.setText(object)
self.pbar.setMaximum(n)
def count(self):
self.pbar.setValue(self.pbar.value() + 1)
def reset(self):
time.sleep(2)
self.pbar.setMaximum(0)
self.pbar.setValue(0)
self.label.setText("...")
if __name__ == '__main__':
loadDisplay = QApplication(sys.argv)
load = loadGame()
load.show()
sys.exit(loadDisplay.exec_())
在网上搜索时,我发现问题与“ time.sleep(2)”有关,也就是说,该指令阻止了直到两秒钟后才出现的窗口。
事实是,我想花一两秒钟的时间来显示该小节的完成,然后重置并继续执行“ def run(self)”中包含的下一条语句。
因此,有没有一种方法可以使该暂停而不使用“时间”模块?我不知道,也许是QTimer?我再说一遍,我对PyQt5不太了解,所以我不知道QTimer是否可以做同样的事情。
如果QTimer无法做到这一点,还有其他可能吗?我想避免使用PyQt5的“线程”,因为我读到可以做到这一点,但是我想避免仅将其用于Timer模块。
我只添加一个问题,以避免打开另一个问题并发布相同的脚本。
在脚本中,通过“ oImage = QImage(“ bgloading.png”)“等完成窗口背景。
但是,我注意到,如果发现文件名错误或文件本身丢失,则背景为黑色。因此,如果有任何错误(名称错误或文件丢失),则可以设置背景,例如白色?
因为当窗口加载“此错误”时,不会引发任何异常并且脚本会继续。
编辑:我已经编辑了发布的脚本,以便它仅包含PyQt5部分,因此您可以尝试一下。显然只有图像丢失了,可以用任何图像替换。
不幸的是,我忘记写报告“
self.set_display()”的部分是为了表明一旦PyQt5执行的工作被终止,它将被关闭(仍然丢失,因为使用Pycharm会关闭执行)程序中脚本的代码)。该脚本将通过调用“
self.set_display()”函数继续。
Edit2:我尝试按照建议替换“
time.sleep(2)”,但得到的结果相同。问题是,如果我不暂停,窗口将正常显示,但是重置发生得太快,用户看不到进度栏的填充。相反,如果我输入“
time.sleep(2)”或建议的解决方案,则该窗口仅在暂停后(即已发生重置时)出现。
等效于time.sleep(2)
PyQt的表达式如下:
loop = QEventLoop()
QTimer.singleShot(2000, loop.quit)
loop.exec_()
造成此问题的原因是您在暂停后显示窗口小部件,您必须在调用之前执行此操作,这run()
也是另一个错误QImage
,因为您必须使用窗口小部件的问题QPixmap
。
如果该文件不存在QPixmap
,则为null,要知道它是否为空,则应使用以下isNull()
方法:
[...]
self.setGeometry(0, 0, self.wLoadDisplay, self.hLoadDisplay)
palette = self.palette()
pixmap = QPixmap("bgloading.png")
if not pixmap.isNull():
pixmap = pixmap.scaled(QSize(self.wLoadDisplay, self.hLoadDisplay))
palette.setBrush(QPalette.Window, QBrush(pixmap))
else:
palette.setBrush(QPalette.Window, QBrush(Qt.white))
self.setPalette(palette)
qtRectangle = self.frameGeometry()
centerPoint = QDesktopWidget().availableGeometry().center()
qtRectangle.moveCenter(centerPoint)
self.move(qtRectangle.topLeft())
self.show()
self.run()
[...]
def reset(self):
loop = QEventLoop()
QTimer.singleShot(2000, loop.quit)
loop.exec_()
self.pbar.setMaximum(0)
self.pbar.setValue(0)
self.label.setText("...")
问题内容: 我等待5秒钟后试图删除文本框内的文本,但是该程序无法运行,并且会休眠其他所有内容。还有一种方法可以让我的文本框进入睡眠状态,以便在冻结文本时可以运行其他代码? 问题答案: 您确实应该使用Tkinter after方法而不是。 在另一个stackoverflow问题中有一个使用after方法的示例。 这是使用after方法的脚本的修改版本:
问题内容: 当我转到页面时,第一个示例是hello world程序。当我在python上运行它时,我看不出与正常的任何区别, 有人可以告诉我区别并举一个简单的例子吗? 我故意将时间从1秒增加到5秒,希望看到一些特别的东西,但我没有。 问题答案: 您不会看到什么特别的东西,因为您的代码中没有太多异步工作。但是,主要区别在于它是阻塞的,并且是非阻塞的。 当被调用时,它会阻止脚本的整个执行,它会被搁置,
描述 (Description) 方法sleep()暂停执行给定的秒数。 参数可以是浮点数,以指示更精确的睡眠时间。 实际的暂停时间可能小于请求的时间,因为任何捕获的信号将在执行该信号的捕获例程后终止sleep()。 语法 (Syntax) 以下是sleep()方法的语法 - time.sleep(t) 参数 (Parameters) t - 这是要暂停的执行秒数。 返回值 (Return Va
问题内容: 我想在我的多线程Python应用程序中定期执行操作。我已经看到了两种不同的方法 要么 一种方法比另一种方法有优势吗?是使用更少的资源还是与其他线程和GIL更好地协作?哪一个使我的应用程序中的其余线程响应更快? (假设有一些外部事件集或,我愿意在关闭时等待完整的延迟) 问题答案: 使用将具有更高的响应速度,因为在设置时,您将立即退出while循环。使用,即使在设置了事件之后,您也将在通话
我遇到的问题是,当我试图保持屏幕上的第一个函数(StartUpScr)小部件3秒钟使用time.sleep(3)删除所有它的小部件放在屏幕上,然后继续放置下一个函数(MenuScr)小部件。我已经成功地使用销毁()删除第一个小部件,并用第二个小部件替换它们,但由于某种原因,当输入time.sleep(3)在函数和主程序的任何地方,而不是第一个小部件停留3秒钟然后被替换,它会延迟程序的开始,产生一个
问题内容: 我有下一个代码: par.go 我用next运行它: 然后,确认此过程中有多少个线程: 您可以看到有5个线程。 如果我更改in代码的值,那么接下来的情况是: 我知道,去调度的后续机型,在这里,所以,是有(内核线程)。如果任何goroutine处于任何阻塞状态,则它们将从current脱离,并找到一个空闲的或新的if(如果找不到)。 所以,我的问题是:真的在阻止goroutine吗?如果