Найти - Пользователи
Полная версия: QProgressDialog
Начало » Python для новичков » QProgressDialog
1
OzMod
Как привязать Функцию к QProgressDialog..
Скажем после нажатия кнопки Test из нижеприведенного исходника, срабатывала скажем функция f() привязаная к QProgressDialog…
#———————————————————————–
 import sys, time
from PyQt4 import QtGui, QtCore
class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.button = QtGui.QPushButton('Test', self)
        self.button.clicked.connect(self.handleButton)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.button)
    def f(self):
        for x in range(150):
            print (x)   
    def handleButton(self):
        file = range(100)
        numberOfLinesInFile = len(file)
        progressWasCancelled = False
        progress = QtGui.QProgressDialog("Parsing Log", "Stop", 0, numberOfLinesInFile, self)
        progress.setWindowModality(QtCore.Qt.WindowModal)
        progress.setMinimumDuration(0)
        for lineNumber, line in enumerate(file):
            progress.setValue(lineNumber)
            if progress.wasCanceled():
                progressWasCancelled = True
                break
            time.sleep(0.10)
        progress.setValue(numberOfLinesInFile)
        print ('cancelled', progress.wasCanceled(), progressWasCancelled)
        progress.deleteLater()
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
PEHDOM
что значит “привязанная” в вашем понимании?
она должна работать паралельно QProgressDialog, или дублировать показания QProgressDialog, или срабатывать при изменении QProgressDialog.value?
OzMod
PEHDOM
Я нашел решение
 import sys, time
from PyQt4 import QtGui, QtCore
class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.button = QtGui.QPushButton('Test', self)
        self.button.clicked.connect(self.handleButton)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.button)
#-----------------------------------------------------------------------------------------------
    def f(self,p):
        for x in range(100):
            print (x)
            p.setValue(x)
            time.sleep(0.10)
            if p.wasCanceled(): break
#-----------------------------------------------------------------------------------------------
    def handleButton(self):
        file = range(100)
        numberOfLinesInFile = len(file)
        progressWasCancelled = False
        progress = QtGui.QProgressDialog("Parsing Log", "Stop", 0, numberOfLinesInFile, self)
        progress.setWindowModality(QtCore.Qt.WindowModal)
        progress.setMinimumDuration(0)
        self.f(progress)
        progress.setValue(numberOfLinesInFile)
        print ('cancelled', progress.wasCanceled(), progressWasCancelled)
        progress.deleteLater()
#------------------------------------------------------------------------------------------------
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
OzMod
помогите как мне решить одну проблему, не могу привязать очередную функцию к QProgressDialog!
Как привязать выполнение функции f() из примера показанного ниже к QProgressDialog?
—————————————————————-
 import sys, time, shutil, base64, zlib
from PyQt4 import QtGui, QtCore
class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.button = QtGui.QPushButton('Запустить процесс', self)
        self.button.clicked.connect(self.handleButton)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.button)
#-----------------------------------------------------------------------------------------------
    def f(self):
        CodeOF = open("mypdf.pdf","rb")
        CodeRF = CodeOF.read()
        CodeOF.close()
        #---------------------------
        EncodeBase64 = base64.b64encode(CodeRF)
        #---------
        CompressDATE = zlib.compress(EncodeBase64)
        #---------
        CodeOF = open("mypdf.pdf","wb")
        CodeOF.write(CompressDATE)
        CodeOF.close()
        shutil.os.renames("mypdf.pdf","mypdf.pdf"+r".OzKEY")
#-----------------------------------------------------------------------------------------------
    def handleButton(self):
        file = range(100)
        numberOfLinesInFile = len(file)
        progressWasCancelled = False
        progress = QtGui.QProgressDialog("Статус выполнения", None, 0, numberOfLinesInFile, self)
        progress.setWindowModality(QtCore.Qt.WindowModal)
        progress.setMinimumDuration(0)
        for lineNumber, line in enumerate(file):
            progress.setValue(lineNumber)
            if progress.wasCanceled():
                progressWasCancelled = True
                break
            time.sleep(0.10)
        progress.setValue(numberOfLinesInFile)
        print ('cancelled', progress.wasCanceled(), progressWasCancelled)
        progress.deleteLater()
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
PEHDOM
А какой прогресс вы хотите к этой функции прикрутить? Она у вас чтото делает? открывает файл, считывает его,перекодирует, сжимает, записывает. Каким образом вы хотите видеть прогресс этих операций? сколько от общего прогресса должна занимать каждая операция? Например вы делаете CodeRF = CodeOF.read() сколько это в процентах от всей функции??
Честно говоря сомневаюсь что есть каконить модуль который сможет определить заранее сколько будет занимать то или иное действие в вашей процедуре, и выдавать в реальном времени процент выполнения вашей процедуры. Поэтому придеться все делать ручками.

Вариант 1 грубый: можно просто разделить процедуру на несколько частей, например на пять в вашем примере.Прочитали файл - 20%, перекодировали, еще + 20%, ….. переименовали - 100%. При завершении каждой части посылать на прогрессбар сигнал с соответствующим процентом. по типу:
     def f(self,p):
        CodeOF = open("mypdf.pdf","rb")
        CodeRF = CodeOF.read()
        CodeOF.close()
        p.setValue(20)
        #---------------------------
        EncodeBase64 = base64.b64encode(CodeRF)
        p.setValue(40)
        #---------
        CompressDATE = zlib.compress(EncodeBase64)
        p.setValue(60)
        #---------
        CodeOF = open("mypdf2.pdf","wb")
        CodeOF.write(CompressDATE)
        CodeOF.close()
        p.setValue(80)
        shutil.os.renames("mypdf2.pdf","mypdf.pdf"+r".OzKEY")
        p.setValue(100)
ну и вызывать ее соответвенно self.f(progress) вместо for lineNumber, line in enumerate(file):

Вариант 2 мазохистский: все тоже самое + также процесс считывания/записи в процентах считать, Для этого читайте файл не целиком а кусками (блоками или строками), ну и соответвенно передавайте в прогрессбар к-во прочитаного.
Тогда кусок
  CodeOF = open("mypdf.pdf","rb")
        CodeRF = CodeOF.read()
        CodeOF.close()
        p.setValue(20)
будет выглядеть вот так
 fsize = os.path.getsize('mypdf.pdf') #размер файла котороый читаем
        BLOCKSIZE = 1024       #размер блока, котороыми читаем файл
        CodeOF = open("mypdf.pdf","rb")
        CodeRF = b''
        while  CodeOF.tell() <  fsize:
            CodeRF += CodeOF.read(BLOCKSIZE)
            # вобще это плохая идея с точки зрения быстродействия, поскольку строки неизменяемые,
            # лучше использовать например список, а в конце join-ом обьединить все элементы в один файл.
            # но для наглядности сгодиться.
            p.setValue(CodeOF.tell()/fsize*20)
            # CodeOF.tell()/fsize*20 - ,будет передавать процент считывания файла, полностью считаный файл будет = 20%прогрессбара
        CodeOF.close()
Также делаете с записью и перекодировкой, но это уже херня и говнокод. Слишком много лишнего кода. нужно менять всю концепцию..
Переходим к третьему варианту:Читать кусками , сразу прочитаный кусок перкодировать, сжимать и писать в файл, выводить процент выполнения. типа такого:
 def f(self,p):
        fsize = os.path.getsize('_tqdm.py') #размер файла котороый читаем
        BLOCKSIZE = 1024       #размер блока, котороыми читаем файл (взят "с потолка"для примера)
        CodeOF = open("mypdf.pdf","rb") # Файл из которого читаем
        CodeRF = open("mypdf_out.pdf","ab") # Файл куда пишем
        while  CodeOF.tell() <  fsize:
            readBlock = CodeOF.read(BLOCKSIZE)  #читаем  кусок
            base64Block = base64.b64encode(readBlock)
            CompressBlock = zlib.compress(base64Block)# Вот тут я не уверен что так правильно. 
#Вернее всего так неправильно , но с zlib я не работал не могу сказать как оно должно работать в таком случае.
# Смотрите в сторону compressobj.compress(string) и compressobj.flush(). Както так, экспериментируйте. :)
           CodeRF.write(CompressBlock)   #пишем сжатый кусок    
            p.setValue(CodeOF.tell()/fsize*100) # выводим на прогресбар прогресс выполнения, 100% будет = полностью прочитаному, перекодированому, сжатому и записаному файлу.
        CodeOF.close()
        CodeRF.close()





OzMod
PEHDOM
БОЛЬШОЕ Спасибо за подробное обьяснение ! +
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB