Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 11, 2017 18:26:10

OzMod
Зарегистрирован: 2017-01-11
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

QProgressDialog

Как привязать Функцию к 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_())

Офлайн

#2 Янв. 16, 2017 14:59:29

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

QProgressDialog

что значит “привязанная” в вашем понимании?
она должна работать паралельно QProgressDialog, или дублировать показания QProgressDialog, или срабатывать при изменении QProgressDialog.value?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Янв. 16, 2017 15:01:07)

Офлайн

#3 Янв. 16, 2017 15:15:52

OzMod
Зарегистрирован: 2017-01-11
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

QProgressDialog

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

Офлайн

#4 Апрель 2, 2017 00:18:16

OzMod
Зарегистрирован: 2017-01-11
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

QProgressDialog

помогите как мне решить одну проблему, не могу привязать очередную функцию к 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_())

Офлайн

#5 Апрель 2, 2017 19:18:02

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

QProgressDialog

А какой прогресс вы хотите к этой функции прикрутить? Она у вас чтото делает? открывает файл, считывает его,перекодирует, сжимает, записывает. Каким образом вы хотите видеть прогресс этих операций? сколько от общего прогресса должна занимать каждая операция? Например вы делаете 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()







==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Апрель 2, 2017 21:16:02)

Офлайн

#6 Апрель 2, 2017 22:23:08

OzMod
Зарегистрирован: 2017-01-11
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

QProgressDialog

PEHDOM
БОЛЬШОЕ Спасибо за подробное обьяснение ! +

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version