Python 进度条PyQt5型矿车锻造

Python 进度条PyQt5型矿车锻造,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我有一个关于PyQt5的请求,我正在寻找解决方案。我正在用Pygame创建一个视频游戏,为了上传资源(图像、音频等),我想使用PyQt5。我已经创建了一个带有进度条的窗口,并对其进行了图形化修改(css等) 我的目标是在Minecraft Forge样式的PyQt5中创建一个窗口,如果有,则有一个带有进度条的白色窗口,其中加载MOD、纹理等,并在加载的资源条下写入名称和百分比(如果是Minecraft Forge,则为数量,例如:74/1349) 问题是,我无法理解如何删除示例中的按钮并替换它,

我有一个关于PyQt5的请求,我正在寻找解决方案。我正在用Pygame创建一个视频游戏,为了上传资源(图像、音频等),我想使用PyQt5。我已经创建了一个带有进度条的窗口,并对其进行了图形化修改(css等)

我的目标是在Minecraft Forge样式的PyQt5中创建一个窗口,如果有,则有一个带有进度条的白色窗口,其中加载MOD、纹理等,并在加载的资源条下写入名称和百分比(如果是Minecraft Forge,则为数量,例如:74/1349)

问题是,我无法理解如何删除示例中的按钮并替换它,以便每次从程序加载资源时,进度条都会更新

在我的例子中,在初始化“游戏类”时调用“加载类”

为了更好地解释,我想在PyQt5中创建一个带有进度条的窗口,如下所示:



从“游戏类”加载资源,并更新加载的每个资源的进度条,或者类似的东西

为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_())