[英]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()
外,您應該創建另一個線程並在其中使用QRunnable
和QThreadPool
運行該線程。更新值,如下所示:
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.