Python, Как сделать прогресс бар который будет показывать выполнение всей моей функции?

У меня есть небольшая программа,интерфейс для которого делал в QT Designer, в своей программе сделал единственную кнопку (больше и не надо), и при нажатии выполняется единственная функция, но внутри этой функции много разных процессов,такие как отправка письма с файлом через почту , получение нового письма с другим файлом , и вывод части полученных данных на экран ввиде текста . И я хотел бы что бы при выполнении этой единственной функции,показывался процесс выполнения в прогресс баре (как сделать прогресс бар в QT Designer я знаю)

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

Так выглядит сама программа

"""

def btn_click(self):  # Функция которая выполняется при нажатии на кнопки
    QCoreApplication.processEvents()

    #Авторизация на почте и отправка письма с файлом
    server = smtplib.SMTP_SSL('smtp.mail.ru', 465)
    user = self.mailUsername
    password = self.mailPassword
    recipients = [self.adresat]
    sender = self.mailUsername
    subject = self.mailTheme
    text = self.mailText
    html = '<html><head></head><body><p>' + text + '</p></body></html>'

    print("Авторизовался")

    QCoreApplication.processEvents()

    filepath = self.pathSend              # Путь файла magcorr3.in для отправки роботу
    basename = os.path.basename(filepath)
    filesize = os.path.getsize(filepath)

    QCoreApplication.processEvents()

    msg = MIMEMultipart('alternative')
    msg['Subject'] = subject
    msg['From'] = 'NPF-Gorizont <' + sender + '>'
    msg['To'] = ', '.join(recipients)
    msg['Reply-To'] = sender
    msg['Return-Path'] = sender
    msg['X-Mailer'] = 'Python/' + (python_version())

    QCoreApplication.processEvents()

    part_text = MIMEText(text, 'plain')
    part_html = MIMEText(html, 'html')
    part_file = MIMEBase('application', 'octet-stream; name="{}"'.format(basename))
    part_file.set_payload(open(filepath, "rb").read())
    part_file.add_header('Content-Description', basename)
    part_file.add_header('Content-Disposition', 'attachment; filename="{}"; size={}'.format(basename, filesize))
    encoders.encode_base64(part_file)

    QCoreApplication.processEvents()

    msg.attach(part_text)
    msg.attach(part_html)
    msg.attach(part_file)

    QCoreApplication.processEvents()

    mail = smtplib.SMTP_SSL('smtp.mail.ru', 465)
    mail.login(self.mailUsername, self.mailPassword)
    mail.sendmail(sender, recipients, msg.as_string())
    mail.quit()

    print("Файл отправлен")

    QCoreApplication.processEvents()

    #Авторизация и загрузка файла
    host = "imap.mail.ru"
    username = self.mailUsername
    password = self.mailPassword  # Пароль для внешних приложений
    download_folder = self.pathSave  # Путь к папке загрузки файла от робота

    QCoreApplication.processEvents()
    print("Залогинился для получения")

    QCoreApplication.processEvents()

    if not os.path.isdir(download_folder):
        os.makedirs(download_folder, exist_ok=True)

    mail = Imbox(host, username=username, password=password, ssl=True, ssl_context=None, starttls=False)

    QCoreApplication.processEvents()

    if self.mailFilter == "flagged=True":
        messages = mail.messages(sent_from= self.mailFromSaveUsername,
                             flagged=True)
    else:
        messages = mail.messages(sent_from= self.mailFromSaveUsername,
                             unread=True)      # по умолчанию — входящие (сейчас стоит флаг = истинно что значит будут использоваться только помечанные письма

    QCoreApplication.processEvents()

    for (uid, message) in messages:
        mail.mark_seen(uid)  # пометить сообщение как прочитанное

        print("Письмо открыто")

        QCoreApplication.processEvents()

        # Скачать файл из письма на почте

        # Скачать файл из письма на почте
        self.ui.Knopka.setEnabled(False)

        QCoreApplication.processEvents()
        for idx, attachment in enumerate(message.attachments):
            if attachment['filename'].endswith(('.csv')):  # Если название файла заканчивается на .csv

                QCoreApplication.processEvents()

                try:
                    att_fn = attachment.get('filename')
                    download_path = f"{download_folder}/{att_fn}"
                    print(download_path)
                    with open(download_path, "wb") as fp:
                        fp.write(attachment.get('content').read())
                except:
                    print(traceback.print_exc())
        self.ui.Knopka.setEnabled(True)
    print("Файл Скачал")

    mail.logout()  # Закрыть почту
    #Закрыть почту

    QCoreApplication.processEvents()

    # Работа с данными из таблицы (Получение и выведение данных)
    dataset = pd.read_csv('Output.csv') # Открыть таблицы для работы с ней (таблица обязательно должно быть в папке с программой

    df = dataset.fillna(0)  # Необхомим для того чтобы перевести NoN в 0

    print("Файл открыт для обработки")

    X = df.iloc[-1:, 0:3].values # Значения глубины, угла и азимута из таблицы
    glub = f"  {X[0][0]}" # Глубина из таблицы
    glubina = glub
    ug = f"  {X[0][1]}" # Угол из таблицы
    ugol = ug
    az = f"  {X[0][2]}" # Азимут из таблицы
    azimut = az
    self.ui.glub_pole.setText(glubina)  #Вывести глубину
    self.ui.ugol_pole.setText(ugol) #Вывести угол
    self.ui.az_pole.setText(az) # Вывести Азимут

    Z = df.iloc[-1:, 19:22].values  # Значения качества по Magcorr
    G = f" {Z[0][0]}"  # Gt из таблицы
    Gt = G
    B = f" {Z[0][1]}"  # Bt из таблицы
    Bt = B
    D = f" {Z[0][2]}"  # Dip из таблицы
    Dip = D
    self.ui.Gt_pole.setText(Gt)  # Вывести Gt
    self.ui.Bt_pole.setText(Bt)  # Вывести Bt
    self.ui.Dip_pole.setText(Dip)  # Вывести Dip

    #Функция для вывода сообщения НАРАЩИВАНИЕ или ПЕРЕСНЯТЬ в зависимости от качества
    uspeshno = "Наращиваемся"
    resurve = "Переснять замер"
    if Bt == "?" or Bt == "0" and Dip == "?" or Dip == "0" and Gt == "   ?" or Gt == "0" or Gt == "   X":
        self.ui.uspeh.setText(uspeshno)

    else:
        self.ui.resurv.setText(resurve)

"""


Ответы (0 шт):