Форум сайта python.su
Как привязать Функцию к 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_())
Офлайн
что значит “привязанная” в вашем понимании?
она должна работать паралельно QProgressDialog, или дублировать показания QProgressDialog, или срабатывать при изменении QProgressDialog.value?
[code python][/code]
Отредактировано PEHDOM (Янв. 16, 2017 15:01:07)
Офлайн
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_())
Офлайн
помогите как мне решить одну проблему, не могу привязать очередную функцию к 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_())
Офлайн
А какой прогресс вы хотите к этой функции прикрутить? Она у вас чтото делает? открывает файл, считывает его,перекодирует, сжимает, записывает. Каким образом вы хотите видеть прогресс этих операций? сколько от общего прогресса должна занимать каждая операция? Например вы делаете 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)
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)
Офлайн
PEHDOM
БОЛЬШОЕ Спасибо за подробное обьяснение ! +
Офлайн