簡體   English   中英

進度條PyQt5風格的Minecraft Forge

[英]Progress Bar PyQt5 style Minecraft Forge

我對PyQt5有一個要求,我正在尋求一個解決方案。 我正在Pygame中創建一個視頻游戲,並希望使用PyQt5上傳資源(圖像,音頻等)。 通過遵循此步驟 ,我已經創建了一個帶有進度條的窗口,並對其進行了圖形化修改(css等)。

我的目標是使用Minecraft Forge風格的PyQt5窗口,如果有的話,這里有一個帶有進度條的白色窗口,其中加載了mod,紋理等,並且名稱被寫在已加載的資源欄下和百分比(如果是《我的世界》,則為數量,例如: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)


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

    while True:
        g = input("aggiornare?")
        if g is "y":
            w.pbar.setValue(w.pbar.value()+1)

        sys.exit(app.exec_())


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)
        timer = QTimer(self)
        timer.start(1000)
        self.setGeometry(300, 300, 280, 170)
        self.setWindowTitle('QProgressBar')
        self.show()
        self.run()

    def run(self):
        while True:
            g = input("aggiornare?")
            if g is "y":
                self.onTimeout()

    def onTimeout(self):
        self.pbar.setValue(self.pbar.value()+1)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Widget()
    sys.exit(app.exec_())

我也嘗試過其他方式,但是它們彼此相似。

要設置文本格式,必須使用setFormat()方法,必須通過setMaximum()設置最大值,並通過setValue()設置當前值,在以下示例中,我使用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行為QThreadPool ,除了QMetaObject::invokeMethod()外,您應該創建另一個線程並在其中使用QRunnableQThreadPool運行該線程。更新值,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM