Python 进度条PyQt5型矿车锻造
我有一个关于PyQt5的请求,我正在寻找解决方案。我正在用Pygame创建一个视频游戏,为了上传资源(图像、音频等),我想使用PyQt5。我已经创建了一个带有进度条的窗口,并对其进行了图形化修改(css等) 我的目标是在Minecraft Forge样式的PyQt5中创建一个窗口,如果有,则有一个带有进度条的白色窗口,其中加载MOD、纹理等,并在加载的资源条下写入名称和百分比(如果是Minecraft Forge,则为数量,例如:74/1349) 问题是,我无法理解如何删除示例中的按钮并替换它,以便每次从程序加载资源时,进度条都会更新 在我的例子中,在初始化“游戏类”时调用“加载类” 为了更好地解释,我想在PyQt5中创建一个带有进度条的窗口,如下所示:Python 进度条PyQt5型矿车锻造,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我有一个关于PyQt5的请求,我正在寻找解决方案。我正在用Pygame创建一个视频游戏,为了上传资源(图像、音频等),我想使用PyQt5。我已经创建了一个带有进度条的窗口,并对其进行了图形化修改(css等) 我的目标是在Minecraft Forge样式的PyQt5中创建一个窗口,如果有,则有一个带有进度条的白色窗口,其中加载MOD、纹理等,并在加载的资源条下写入名称和百分比(如果是Minecraft Forge,则为数量,例如:74/1349) 问题是,我无法理解如何删除示例中的按钮并替换它,
从“游戏类”加载资源,并更新加载的每个资源的进度条,或者类似的东西 为eyllanesc编辑:
我试过:
class Widget(QWidget):
def __init__(self, *args, **kwargs):
QWidget.__init__(self, *args, **kwargs)
self.pbar = QProgressBar(self)
self.pbar.setGeometry(30, 40, 200, 25)
self.pbar.setFormat("%v/%m")
self.pbar.setMaximum(150)
self.pbar.setValue(0)
self.setGeometry(300, 300, 280, 170)
self.setWindowTitle('QProgressBar')
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
while True:
g = input("aggiornare?")
if g is "y":
w.pbar.setValue(w.pbar.value()+1)
我也尝试过其他方法,但它们彼此相似。要设置文本格式,必须使用该方法,必须设置最大值至和当前值至,在下面的示例中,我使用QTimer模拟资源负载: 完整代码:
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class Widget(QWidget):
def __init__(self, *args, **kwargs):
QWidget.__init__(self, *args, **kwargs)
self.pbar = QProgressBar(self)
self.pbar.setGeometry(30, 40, 200, 25)
self.pbar.setFormat("%v/%m")
self.pbar.setMaximum(150)
self.pbar.setValue(1)
timer = QTimer(self)
timer.timeout.connect(self.onTimeout)
timer.start(1000)
self.setGeometry(300, 300, 280, 170)
self.setWindowTitle('QProgressBar')
def onTimeout(self):
self.pbar.setValue(self.pbar.value()+1)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
输出:
在pygame中,一个人负责生成一个无限循环,但在PyQt中,一个人通过
app.exec()
调用该循环,也就是说,该循环是内部的。因此,不应直接使用input()
,因为它会锁定该循环并生成GUI行为不正确,除了使用QMetaObject::invokeMethod()
更新如下所示的值之外,还应创建另一个线程并在那里运行它
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class Widget(QWidget):
def __init__(self, *args, **kwargs):
QWidget.__init__(self, *args, **kwargs)
self.pbar = QProgressBar(self)
self.pbar.setGeometry(30, 40, 200, 25)
self.pbar.setFormat("%v/%m")
self.pbar.setMaximum(150)
self.pbar.setValue(0)
self.setGeometry(300, 300, 280, 170)
self.setWindowTitle('QProgressBar')
self.show()
self.runnable = Runnable(self)
QThreadPool.globalInstance().start(self.runnable)
@pyqtSlot()
def updateProgressBar(self):
self.pbar.setValue(self.pbar.value()+1)
class Runnable(QRunnable):
def __init__(self, w):
QRunnable.__init__(self)
self.w = w
def run(self):
while True:
g = input("aggiornare?")
if g is "y":
QMetaObject.invokeMethod(self.w, "updateProgressBar", Qt.QueuedConnection)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Widget()
sys.exit(app.exec_())
你的解释令人困惑,你可以更好地解释自己,也许可以用你想要得到的图像来支持你。另外,展示你的代码。在其他地方跟随一个链接是不重要的,你可以根据自己的需要进行调整。不幸的是,我现在不能插入我的代码,因为里面有我正在修改的非工作部分。这就是为什么我链接了一个页面,从中我获得了进度条的提示。我唯一要问的是,我如何在没有按钮的情况下启动进度条,并在没有计时器的情况下更新进度条。非常感谢您的回答,这就是我一直在寻找的!我只想再问一次一个问题。在您的示例中,我可以从外部类或函数调用“onTimeout”函数吗?或者该调用应该是同一类的一部分?从这个意义上说,如果在创建窗口后,外部调用了“onTimeout”函数,那么进度条是否仍在更新?@GTRE您可以直接调用它,但如果您想通过
w.pbar.setValue(某些值)
直接更新它,则计时器部分是可选的。如果我的答案对您有帮助,请不要忘记标记我的答案。@GTRE我还建议您不要将pygame库与PyQt结合,您可能会有不适当的行为。如果是外部调用,我该怎么做?我现在做了一些尝试,使用带有输入和if的while循环。当答案正确时,它被称为“w.pbar.setValue(w.pbar.value()+1)”,但窗口被阻塞。。。我的意思是,我不明白什么时候该叫。。。。如果您觉得无聊,我很抱歉,但是没有太多的指南可以很好地解释…@GTRE它显示了您试图为您提供正确选项的代码,在GUI中阻塞循环是不正确的。
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class Widget(QWidget):
def __init__(self, *args, **kwargs):
QWidget.__init__(self, *args, **kwargs)
self.pbar = QProgressBar(self)
self.pbar.setGeometry(30, 40, 200, 25)
self.pbar.setFormat("%v/%m")
self.pbar.setMaximum(150)
self.pbar.setValue(1)
timer = QTimer(self)
timer.timeout.connect(self.onTimeout)
timer.start(1000)
self.setGeometry(300, 300, 280, 170)
self.setWindowTitle('QProgressBar')
def onTimeout(self):
self.pbar.setValue(self.pbar.value()+1)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class Widget(QWidget):
def __init__(self, *args, **kwargs):
QWidget.__init__(self, *args, **kwargs)
self.pbar = QProgressBar(self)
self.pbar.setGeometry(30, 40, 200, 25)
self.pbar.setFormat("%v/%m")
self.pbar.setMaximum(150)
self.pbar.setValue(0)
self.setGeometry(300, 300, 280, 170)
self.setWindowTitle('QProgressBar')
self.show()
self.runnable = Runnable(self)
QThreadPool.globalInstance().start(self.runnable)
@pyqtSlot()
def updateProgressBar(self):
self.pbar.setValue(self.pbar.value()+1)
class Runnable(QRunnable):
def __init__(self, w):
QRunnable.__init__(self)
self.w = w
def run(self):
while True:
g = input("aggiornare?")
if g is "y":
QMetaObject.invokeMethod(self.w, "updateProgressBar", Qt.QueuedConnection)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Widget()
sys.exit(app.exec_())