2017-01-18 3 views
2

ファイルが読み込まれてもプログレスバーが進行しているにもかかわらず、設定された状態で更新されません。プログレスバーの更新を担当する変数に、別の変数ではなく明示的な値を与える必要があるようです。以下のコード、具体的には私のloadfileの機能を見てください。pyqtのプログレスバーがファイルを読み取るために正しく更新されない

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を返します。

もう1つの問題は、動作し、プログレスバーが更新されているときに、UI全体がフリーズすることです。それはすべてのUIスレッドを使用しているようなもので、私はそれを回避する方法を知らない。私はアプリを閉じたり何かをすることはできません。 x、Python2では

x = 100/self.line_count() 

答えて

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

あなたの例に問題がこのラインであることを行うために別のものを作成する必要があります整数除算を使用するかどうかにかかわらず、常にゼロに評価されます。浮動小数点値を取得するには、オペランドの一つがフロートにする必要があります

x = float(100)/self.line_count() 

変更あなたの例を動作させるために必要とされるすべてです。別のスレッドを使用する必要はありません.IO操作のみを実行しているためです。 PythonはIO操作中にGILを解放するため、GUIはブロックされません。

あなたloadfile方法は、もう少しこのような洗練することができます。ありがとう

def loadfile(self): 
    file_in = 'xfile' 
    # no need to call out to wc for line count 
    x = float(100)/os.path.getsize(file_in) 
    # start at 1 so the progress bar goes to 100% 
    loading = 1 
    with open(file_in) as f: 
     for line in f: 
      # use line length to calculate progress 
      loading += x * len(line) 
      self.progress.setValue(loading) 
      # this may help to keep the gui responsive 
      QtGui.qApp.processEvents() 
+0

、これは多くの – answerSeeker

+0

は、プログレスバーはOKですが、それはこのように動作しながら、GUIがまだロックされている事を明らかにしています。 @ TatakaiWasumi。 – answerSeeker

+0

それは私のためにうまくいくので、それは奇妙です。プログレスバーが更新されている場合、GUIはブロックされません。 @ TatakaiWasumi – ekhumoro

関連する問題