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

Как сделать рабочий Progress Bar в tkinter?

Хочу в свой парсер добавить прогресс бар, чтобы при завершении прохода страницы шкала прогресса заполнялась, но как и в случае с label во время парсера, приложение не отвечает, пока работает парсер. Как можно исправить это? Или это особенности работы парсера и реализовать такое в принципе не выйдет?
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
from openpyxl import load_workbook
from openpyxl.styles import Alignment
import requests
import pandas as pd
import time
from tkinter import *
from tkinter import ttk

region_name = ["Любая", "Брестская", "Витебская", "Гомельская", "Гродненская", "Минск", "Минская", "Могилевская"]

def update_region_options(event):
    # Получаем выбранную область
    selected_region = combobox_rg_name.get()
 

def parser_vacancies():
    label_status.config(text="Поиск вакансий...")
    root.update_idletasks()  # Обновляем интерфейс

    # Код парсера
    progress_bar["maximum"] = max_page
    label_status.config(text=f"Найдено страниц: {max_page}")
    root.update_idletasks()

    for page in range(1, max_page + 1):
        # print(f"Сбор данных со страницы {page}...")
        label_status.config(text=f"Сбор данных со страницы {page}...")
        root.update_idletasks()
        current_url = driver.current_url.split("&page=")[0]  # Убираем старый номер страницы из URL
        new_url = f"{current_url}&page={page}"
        driver.get(new_url)
        time.sleep(3)
            
    # Код парсера
       
    # Обновляем статус прогресса
    progress_label.config(text=f"Обработано {page} из {max_page} страниц")
    progress_bar["value"] = page
    root.update_idletasks()

    driver.quit()

    # Код форматирования excel файла

    progress_label.config(text="Готово!")
    root.update_idletasks()

root = Tk()
root.title("Парсер вакансий")
root.geometry("350x400")
root.resizable(False, False)
root.iconbitmap(default="parser.ico")

region_var = StringVar(value=region_name[0]) 

label_vacancy = ttk.Label(text="Введите интересующую вакансию:", font=("Arial", 11))
label_vacancy.pack()

entry_vacancy = ttk.Entry()
entry_vacancy.pack(pady=5)

label_region = ttk.Label(text="Выберите область:", font=("Arial", 11))
label_region.pack()

combobox_rg_name = ttk.Combobox(textvariable=region_var, values=region_name, state="readonly")
combobox_rg_name.bind('<<ComboboxSelected>>', update_region_options)  # Обновляем регионы при изменении области
combobox_rg_name.pack(pady=5)

label_district = ttk.Label(text="Выберите район:", font=("Arial", 11))
label_district.pack()

combobox_dist_name = ttk.Combobox(textvariable='Любой', state="readonly")
combobox_dist_name.pack()

btn = ttk.Button(text="Поиск", command=parser_vacancies)
btn.pack()

label_status = ttk.Label()
label_status.pack()

# Добавляем прогресс-бар в окно
progress_label = ttk.Label(root, text="Прогресс: 0%", font=("Arial", 12))
progress_label.pack()
progress_bar = ttk.Progressbar(root, length=300, mode="determinate")
progress_bar.pack()

root.mainloop()
  • Вопрос задан
  • 36 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@dim5x
ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
Парсер отдельно от GUI. Выносите парсер в отдельный поток / процесс или используйте асинхрон. Таким образом парсер не будет блокировать обновление интерфейса.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы