我在应用中有一个进度条,当文件被读取时它应该会进展,但它根本没有根据我的设置条件进行更新。看来我需要给负责更新进度条的变量一个显式值而不是另一个变量。请查看下面的代码,特别是我的loadfile
函数。
import sys
from PyQt4 import QtCore, QtGui
import subprocess
from time import sleep
class AppView(QtGui.QDialog):
def __init__(self, parent=None):
super(AppView, self).__init__(parent)
self.resize(400, 400)
self.buttonStart = QtGui.QPushButton(self)
self.buttonStart.setText("Start")
self.buttonStart.clicked.connect(self.start)
self.progress = QtGui.QProgressBar(self)
self.progress.setGeometry(200, 80, 250, 20)
verticalLayout = QtGui.QVBoxLayout(self)
verticalLayout.addWidget(self.buttonStart)
verticalLayout.addWidget(self.progress)
def line_count(self):
p = subprocess.Popen(['wc', '-l', 'xfile'], stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
result, err = p.communicate()
if p.returncode != 0:
raise IOError(err)
return int(result.strip().split()[0]) #returns 407 lines
def start(self):
self.loadfile()
def loadfile(self):
x = 100/self.line_count()
loading = 0
file_in = "xfile"
with open(file_in) as f:
for line in f:
#sleep(0.1)
print line
loading += x
#loading += 0.245700246
self.progress.setValue(loading)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
appview = AppView()
appview.show()
sys.exit(app.exec_())
但是,如果我像这样loading += 0.245700246
设置加载它就可以了。我不明白为什么loading += x
没有做同样的事情,因为它也会返回0.245700246。
另一个问题是,当它工作且进度条正在更新时,整个UI都会被冻结。它喜欢使用所有的ui线程,但我还不知道如何解决这个问题。我无法关闭应用程序或执行任何其他操作。
答案 0 :(得分:1)
您无法在主线程中更新进度条,您必须创建另一个进度条
class Progress(QtCore.QThread):
def __init__(self):
QtCore.QThread.__init__(self)
def run(self):
self.emit(QtCore.SIGNAL('__updateProgressBar(int)'), 0) ## Reset progressbar value
file_in = "xfile"
loading = 0
with open(file_in) as f:
fl_content = f.read().splitlines()
total_lines = len(fl_content)
for i, line in enumerate(fl_content):
print line
self.emit(QtCore.SIGNAL('__updateProgressBar(int)'), i*100/total_lines)
sleep(0.1)
class AppView(QtGui.QDialog):
def __init__(self, parent=None):
super(AppView, self).__init__(parent)
self.resize(400, 400)
self.buttonStart = QtGui.QPushButton(self)
self.buttonStart.setText("Start")
self.buttonStart.clicked.connect(self.start)
self.progress = QtGui.QProgressBar(self)
self.progress.setGeometry(200, 80, 250, 20)
verticalLayout = QtGui.QVBoxLayout(self)
verticalLayout.addWidget(self.buttonStart)
verticalLayout.addWidget(self.progress)
self.progressView = Progress()
self.connect(self.progressView, QtCore.SIGNAL("__updateProgressBar(int)"), self.__updateProgressBar)
@QtCore.pyqtSlot(int)
def __updateProgressBar(self, percent):
self.progress.setValue(percent)
def start(self):
self.progressView.start()
答案 1 :(得分:1)
您的示例的问题是这一行:
True
在Python2中,x = 100/self.line_count()
将始终评估为零,无论您是否使用整数除法。要获得浮点值,其中一个操作数必须为float:
x
让您的示例正常运行所需的全部变更。您不需要使用单独的线程,因为您只进行IO操作。 Python在IO操作期间释放GIL,因此GUI不会被阻止。
您的x = float(100) / self.line_count()
方法可以更加细化:
loadfile