progress bar python pyqt5 — Stack Overflow на русском

Умные головы, подскажите как правильно задать значения прогресс бару, при делении видео на кадры получается 700+ кадров например, значение cnt со 100 кадров сразу заполняет прогресс бар на 100. здесь я пытаюсь задать прогресс бар:

for i in range(len(video_colors)):
        video_colors[i] |= image_bits[i]
    video_colors = np.reshape(np.asarray(video_colors), (req_frame_count, vid_height, vid_width, 3)).astype(np.uint8)
    # create dirs
    if os.path.exists("temp"):
        remove_directory_content("temp")
    else:
        make_dir("temp")
    cnt = 1
    for frame in video_colors:
        cv2.imwrite('./temp/frame{:09d}.png'.format(cnt), frame, [cv2.IMWRITE_PNG_COMPRESSION, 0])
        cnt += 1
    print('Starting write back...')
    while True:
        ret, frame = cap.read()
        if ret:
            cv2.imwrite('./temp/frame{:09d}.png'.format(cnt), frame, [cv2.IMWRITE_PNG_COMPRESSION, 0])
            cnt += 1
            w. progressBar.setValue(cnt)  # progressbar
        else:
            break

ПОЛНЫЙ КОД:

def hide(carrier_video, image_message):
    cap = cv2.VideoCapture(carrier_video)
    msg = cv2.imread(image_message)
    vid_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    vid_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    vid_fps = cap.get(cv2.CAP_PROP_FPS)
    # count = 0
    # TIME_LIMIT=100
    req_frame_count = required_frame_count(cap, msg)
    bin_rep_width = bin_rep(msg.shape[1]).zfill(16)
    bin_rep_height = bin_rep(msg.shape[0]).zfill(16)
    bin_rep_mult = bin_rep(msg.shape[0] * msg.shape[1]).zfill(32)
    image_bits = [int(x == '1') for x in bin_rep_width + bin_rep_height + bin_rep_mult]
    for row in msg:
        for column in row:
            for color in column:
                for i in range(8):
                    image_bits.append(int((color & (1 << (7 - i))) != 0))
    video_colors = []
    for i in range(req_frame_count):
        ret, frame = cap.
read() if not ret: raise Exception('Error in extracting video frames') for row in frame: for column in row: for color in range(3): video_colors.append(column[color]) assert len(video_colors) >= len(image_bits) for i in range(len(video_colors) - len(image_bits)): image_bits.append(0) video_colors = [(color & 0xFE) for color in video_colors] for i in range(len(video_colors)): video_colors[i] |= image_bits[i] video_colors = np.reshape(np.asarray(video_colors), (req_frame_count, vid_height, vid_width, 3)).astype(np.uint8) # create dirs if os.path.exists("temp"): remove_directory_content("temp") else: make_dir("temp") cnt = 1 for frame in video_colors: cv2.imwrite('./temp/frame{:09d}.png'.format(cnt), frame, [cv2.IMWRITE_PNG_COMPRESSION, 0]) cnt += 1 print('Starting write back...') while True: ret, frame = cap.
read() if ret: cv2.imwrite('./temp/frame{:09d}.png'.format(cnt), frame, [cv2.IMWRITE_PNG_COMPRESSION, 0]) cnt += 1 w.progressBar.setValue(cnt) # progressbar else: break

Виджеты в PyQt5 | Python 3 для начинающих и чайников

Виджеты – это основные строительные кирпичики приложения. PyQt5 имеет множество разнообразных виджетов, включая кнопки, чекбоксы, ползунки и списки. В этой части руководства, мы опишем несколько полезных виджетов: QCheckBox, ToggleButton, QSlider, QProgressBar и QCalendarWidget.

QCheckBox (чекбокс)

QCheckBox – чекбокс (виджет, который имеет два состояния: включен и выключен). Как правило, чекбоксы используют для функций приложения, которые могут быть включены или выключены.

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QWidget, QCheckBox, QApplication
from PyQt5.QtCore import Qt
class Example(QWidget):
    def __init__(self):
        super().
__init__() self.initUI() def initUI(self): cb = QCheckBox('Show title', self) cb.move(20, 20) cb.toggle() cb.stateChanged.connect(self.changeTitle) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('QCheckBox') self.show() def changeTitle(self, state): if state == Qt.Checked: self.setWindowTitle('QCheckBox') else: self.setWindowTitle('') if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())

В нашем примере, мы создаём чекбокс, который переключает заголовок окна.

cb = QCheckBox('Show title', self)

Это конструктор QCheckBox.

cb.toggle()

Мы установили заголовок окна так, что мы должны к тому же проверять чекбокс. По умолчанию, заголовок окна не установлен и чекбокс выключен.

cb.stateChanged.connect(self.changeTitle)

Мы связываем наш метод changeTitle(), с сигналом stateChanged. Метод changeTitle() будет переключать заголовок окна.

def changeTitle(self, state):
    if state == Qt.Checked:
        self.setWindowTitle('QCheckBox')
    else:
        self.setWindowTitle('')

Если виджет помечен галочкой, мы устанавливаем заголовок окна. В противном случае, мы устанавливаем пустую строку в заголовке.

Кнопка переключателя (toogle button)

Кнопка переключателя – это QPushButton в особом режиме. Это кнопка, которая имеет два состояния: нажатое и не нажатое. Мы переключаемся между этими двумя состояниями, кликая по ней. Существуют ситуации, где эта функциональность отлично подходит.

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QWidget, QPushButton,
    QFrame, QApplication)
from PyQt5.QtGui import QColor
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.col = QColor(0, 0, 0)
        redb = QPushButton('Red', self)
        redb.
setCheckable(True) redb.move(10, 10) redb.clicked[bool].connect(self.setColor) greenb = QPushButton('Green', self) greenb.setCheckable(True) greenb.move(10, 60) greenb.clicked[bool].connect(self.setColor) blueb = QPushButton('Blue', self) blueb.setCheckable(True) blueb.move(10, 110) blueb.clicked[bool].connect(self.setColor) self.square = QFrame(self) self.square.setGeometry(150, 20, 100, 100) self.square.setStyleSheet("QWidget { background-color: %s }" % self.col.name()) self.setGeometry(300, 300, 280, 170) self.setWindowTitle('Toggle button') self.show() def setColor(self, pressed): source = self.sender() if pressed: val = 255 else: val = 0 if source.text() == "Red": self.col.setRed(val) elif source.text() == "Green": self.col.setGreen(val) else: self.
col.setBlue(val) self.square.setStyleSheet("QFrame { background-color: %s }" % self.col.name()) if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())

В нашем примере, мы создаём три кнопки переключателя и QWidget. Мы устанавливаем чёрный цвет фона. Кнопки переключателей будут переключать красные, зелёные и синие части значений цвета. Цвет фона будет зависеть от того, на какие кнопки переключателей мы нажали.

self.col = QColor(0, 0, 0)

Это начальное значение цвета (чёрный).

redb = QPushButton('Red', self)
redb.setCheckable(True)
redb.move(10, 10)

Чтобы создать кнопку переключателя, мы создаём QPushButton и делаем её проверяемой, путём вызова метода setCheckable().

redb.clicked[bool].connect(self.setColor)

Мы привязываем сигнал к нашему пользовательскому методу. Мы используем сигнал clicked, который работает с логическим значением.

source = self.sender()

Мы получаем кнопку, которая была переключена.

if source.text() == "Red":
    self.col.setRed(val)

В случае кнопки red, мы обновляем красную часть цвета соответственно.

self.square.setStyleSheet("QFrame { background-color: %s }" % self.col.name())

Мы используем таблицы стилей, чтобы менять цвет фона.

QSlider (ползунок)

Qslider – ползунок (виджет, который имеет простой регулятор). Этот регулятор может быть утянут назад и вперёд. Таким способом, мы выбираем значение для конкретной задачи. Иногда, использование ползунка более естественно, чем ввод числа или использование переключателя-счётчика. В нашем примере, мы покажем один ползунок и одну метку. Метка будет показывать изображение. Ползунок будет контролировать метку.

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QWidget, QSlider,
    QLabel, QApplication)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
class Example(QWidget):
    def __init__(self):
        super(). __init__()
        self.initUI()
    def initUI(self):
        sld = QSlider(Qt.Horizontal, self)
        sld.setFocusPolicy(Qt.NoFocus)
        sld.setGeometry(30, 40, 100, 30)
        sld.valueChanged[int].connect(self.changeValue)
        self.label = QLabel(self)
        self.label.setPixmap(QPixmap('mute.png'))
        self.label.setGeometry(160, 40, 80, 30)
        self.setGeometry(300, 300, 280, 170)
        self.setWindowTitle('QSlider')
        self.show()
    def changeValue(self, value):
        if value == 0:
            self.label.setPixmap(QPixmap('mute.png'))
        elif value > 0 and value <= 30:
            self.label.setPixmap(QPixmap('min.png'))
        elif value > 30 and value < 80:
            self.label.setPixmap(QPixmap('med.png'))
        else:
            self.label.setPixmap(QPixmap('max.png'))
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

В нашем примере, мы симулируем контроль громкости. Путём перетаскивания регулятора ползунка, мы меняем изображение на метке.

sld = QSlider(Qt.Horizontal, self)

Здесь мы создаём горизонтальный ползунок.

self.label = QLabel(self)
self.label.setPixmap(QPixmap('mute.png'))

Мы создаём виджет QLabel и устанавливаем начальное изображение «Mute» на него.

sld.valueChanged[int].connect(self.changeValue)

Мы привязываем сигнал valueChanged к определенному нами методу changeValue().

if value == 0:
    self.label.setPixmap(QPixmap('mute.png'))
...

Основываясь на значении ползунка, мы устанавливаем изображение на метку. В коде выше, мы устанавливаем изображение mute.png на метку, если ползунок приравнен к нулю.

QProgressBar (прогресс бар)

QProgressBar – прогресс бар (виджет, который используется, когда мы обрабатываем продолжительные задачи). Он анимирует процесс, чтобы пользователи знали, что задача продвигается. Мы можем установить минимальное и максимальное значение для прогресс бара. Значения по умолчанию – 0 и 99.

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QWidget, QProgressBar,
    QPushButton, QApplication)
from PyQt5.QtCore import QBasicTimer
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.pbar = QProgressBar(self)
        self.pbar.setGeometry(30, 40, 200, 25)
        self.btn = QPushButton('Start', self)
        self.btn.move(40, 80)
        self.btn.clicked.connect(self.doAction)
        self.timer = QBasicTimer()
        self.step = 0
        self.setGeometry(300, 300, 280, 170)
        self.setWindowTitle('QProgressBar')
        self.show()
    def timerEvent(self, e):
        if self.step >= 100:
            self.timer.stop()
            self.btn.setText('Finished')
            return
        self.step = self.step + 1
        self.pbar.setValue(self.step)
    def doAction(self):
        if self.timer.isActive():
            self. timer.stop()
            self.btn.setText('Start')
        else:
            self.timer.start(100, self)
            self.btn.setText('Stop')
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

В нашем примере, мы имеем горизонтальный индикатор прогресса и кнопку. Кнопка запускает и останавливает индикатор прогресса.

self.pbar = QProgressBar(self)

Это конструктор QProgressBar.

self.timer = QtCore.QBasicTimer()

Чтобы активировать индикатор прогресса, мы используем объект таймера.

self.timer.start(100, self)

Чтобы запустить событие таймера, мы вызываем его методом start(). Этот метод имеет два параметра: таймаут, и объект, который будет принимать события.

def timerEvent(self, e):
    if self.step >= 100:
        self.timer.stop()
        self.btn.setText('Finished')
        return
    self.step = self.step + 1
    self.pbar.setValue(self.step)

Каждый QObject и его наследники имеют обработчик событий timerEvent(). Для того, чтобы реагировать на события таймера, мы переопределяем обработчик событий.

def doAction(self):
    if self.timer.isActive():
        self.timer.stop()
        self.btn.setText('Start')
    else:
        self.timer.start(100, self)
        self.btn.setText('Stop')

Внутри метода doAction(), мы запускаем и останавливаем таймер.

QCalendarWidget (виджет календаря)

QCalendarWidget предоставляет виджет помесячного календаря. Он позволяет пользователю выбирать дату простым и интуитивно-понятным способом.

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QWidget, QCalendarWidget,
    QLabel, QApplication)
from PyQt5.QtCore import QDate
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        cal = QCalendarWidget(self)
        cal.setGridVisible(True)
        cal.move(20, 20)
        cal.clicked[QDate].connect(self.showDate)
        self. lbl = QLabel(self)
        date = cal.selectedDate()
        self.lbl.setText(date.toString())
        self.lbl.move(130, 260)
        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('Calendar')
        self.show()
    def showDate(self, date):
        self.lbl.setText(date.toString())
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Пример имеет виджет календаря и виджет метки. Текущая выбранная дата отображается в виджете метки.

cal.clicked[QDate].connect(self.showDate)

Если мы выбираем дату из виджета, срабатывает сигнал clicked[QDate]. Мы присоединяем этот сигнал к пользовательскому методу showDate().

def showDate(self, date):
    self.lbl.setText(date.toString())

Мы возвращаем выбранную дату путём вызова метода selectedDate(). Тогда мы превращаем объект даты в строку и устанавливаем его в виджет метки.

В этой части руководства PyQt5, мы изучили некоторые виджеты.

Для вставки кода на Python в комментарий заключайте его в теги <pre><code>Ваш код</code></pre>

python 3.

x — Как обновить QProgressbar из другого модуля?

Задавать вопрос

спросил

Изменено 2 года, 7 месяцев назад

Просмотрено 711 раз

Я хочу обновить индикатор выполнения в моем основном классе графического интерфейса из другого модуля. Поскольку значение индикатора выполнения должно обновляться, пока графический интерфейс все еще работает в своем основном цикле событий, я создал для него поток. Я не могу обновить значение прогресса из потока.

Это просто голый код того, что я на самом деле хочу сделать, но он выдает ту же ошибку.

progress.py

 из времени импорта сна
из PyQt5.QtCore импортировать QObject, pyqtSignal
класс ProgressUpdate(QObject):
progress_signal = pyqtSignal (целое число)
защита __init__(сам):
    супер(). __инит__()
    self.progress_update()
def progress_update (сам):
    для я в диапазоне (0, 101):
        self.progress_signal.emit (я)
        сон(0,01)
 

main.py

 из PyQt5.QtWidgets импортирует QVBoxLayout, QApplication, QProgressBar, QWidget
из PyQt5 импортировать QtCore
импорт системы
из прогресса импорта ProgressUpdate
Пример класса (QWidget):
    защита __init__(сам):
        супер().__инит__()
        self.init_ui()
    определение init_ui (я):
        self.progress_bar = QProgressBar(я)
        self.vbox = QVBoxLayout(я)
        self.vbox.addWidget(self.progress_bar)
        self.setLayout(self.vbox)
        self.setWindowTitle('Прогресс')
        self.p_thread = ProgressThread()
        self.p_thread.start()
        самовыражение()
    def update_progress (я, значение):
        self.progress_bar.setValue (значение)
класс ProgressThread(QtCore.QThread):
    защита __init__(сам):
        супер().__инит__()
    деф запустить (самостоятельно):
        self.obj = ProgressUpdate()
        self. obj.progress_signal.connect(Пример.update_progress)
    
деф основной():
    приложение = QApplication (sys.argv)
    р = Пример ()
    sys.exit(приложение.exec_())
если __name__ == '__main__':
    основной()
 

Когда я запускаю это, появляется индикатор выполнения, но он остается на 0, он не обновляется.

  • python-3.x
  • pyqt5
  • индикатор выполнения
  • слоты сигналов

Вам не нужен отдельный QObject и поток, это усложняет правильное подключение сигнала и слота. Файл progress.py может содержать QThread с циклом для выдачи значения через каждый интервал.

 класс ProgressThread(QtCore.QThread):
    progress_signal = pyqtSignal (целое число)
    защита __init__(сам):
        супер().__инит__()
    деф запустить (самостоятельно):
        для я в диапазоне (0, 101):
            self.progress_signal.emit (я)
            сон(0,01)
 

И в main.py подключить сигнал от треда к слоту в классе.

 Пример класса (QWidget):
    защита __init__(сам):
        супер(). __инит__()
        self.init_ui()
    определение init_ui (я):
        self.progress_bar = QProgressBar(я)
        self.vbox = QVBoxLayout(я)
        self.vbox.addWidget(self.progress_bar)
        self.setLayout(self.vbox)
        self.setWindowTitle('Прогресс')
        self.p_thread = ProgressThread()
        self.p_thread.progress_signal.connect(self.update_progress)
        self.p_thread.start()
        самовыражение()
    def update_progress (я, значение):
        self.progress_bar.setValue (значение)
    
деф основной():
    приложение = QApplication (sys.argv)
    р = Пример ()
    sys.exit(приложение.exec_())
если __name__ == '__main__':
    основной()
 

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

PyQt5 QProgressBar — Как создать индикатор выполнения?

из PyQt5. QtWidgets импорт *  

73 из

740074 import *  

from PyQt5.QtCore import *  

import sys

import time

   

class Example (QWIDGET):

DEF __init __ ( Self ):

):

):

):

):

):

):

)0073 super (). __init__()

   

        

         self .initUI()

   

    

     def initUI( Self ):

Self .PBAR = .0074 QProgressBar( self )

   

        

         self . pbar.setGeometry( 30 , 40 , 200 , 25 )

Self .BTN = .BTN = .0073 QPushButton( 'Start' , self )

   

        

         self .btn.move( 40 , 80

Self . btn.clicked.connect ( Self .0046    

        

         self .setGeometry( 300 , 300 , 280 , 170 )

   

         self .setWindowTitle( "Python" )

6 9007 4 4

3         

         self .show()

   

    

     def doAction( self ):

   

        

         для i в диапазоне ( 101 ): 9073

0074  

            

             time.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *