Einkauf_Suche/einkauf_suche.py
RochoElLocho 13ea049559 Code Optimierung
Überflüssigen Code entfernt.
Neue Webseiten Hinzugefügt. (Tischwelten, Baubeschlagshop, Pacovis)
2023-11-29 13:46:49 +01:00

618 lines
28 KiB
Python

from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout,QLabel, QLineEdit, QPushButton, QCheckBox, QMessageBox, QGridLayout
from concurrent.futures import ThreadPoolExecutor
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import sys
import concurrent.futures
BLANK_PAGE_URL = ""
class SearchThread(QThread):
search_finished = pyqtSignal()
def __init__(self, selected_webpages, search_term, parent=None):
super(SearchThread, self).__init__(parent)
self.selected_webpages = selected_webpages
self.search_term = search_term
self.error_message = None
self.driver = webdriver.Chrome()
def run(self):
try:
for webseite in self.selected_webpages:
self.start_search_on_webseite(webseite)
except Exception as e:
self.error_message = f"Fehler bei der Suche: {e}"
finally:
self.search_finished.emit()
def start_search_on_webseite(self, webseite):
try:
self.driver.execute_script(f"window.open('{BLANK_PAGE_URL}', '_blank');")
self.driver.switch_to.window(self.driver.window_handles[-1])
if webseite == "Reichelt: Technikbedarf":
self.suche_auf_reichelt()
elif webseite == "Conrad: Technik Marktplatz":
self.suche_auf_conrad()
elif webseite == "Kosatec: Elektro Artikel":
self.suche_auf_kosatec()
elif webseite == "Hornbach: Bad, Baustoffe, Holz, Fenster & Türen, Bodenbeläge, Werkzeug, Farben & Tapeten, Garten, Heizen":
self.suche_auf_hornbach()
elif webseite =="Contorion: Befestigungstechnik, Handwerkzeug, Elektrowerkzeug, Materialbearbeitung, Betriebsausstattung":
self.suche_auf_contorion()
elif webseite == "Gastroteile Shop: Geräte/Anwendung, Dichtungs- Elektro- Gas- Wasser-Komponenten, Werkzeuge":
self.suche_auf_gastroteileshop()
elif webseite == "TiroLED: LED Beleuchtung, Digital Signage":
self.suche_auf_tiroled()
elif webseite == "Megabad: Badarmaturen, Badkeramik, Badmöbel, Badewannen, Duschwannen, Duschkabine, Badheizkörper":
self.suche_auf_megabad()
elif webseite == "Baubeschlagshop: Beschläge, Rollen, installationsbedarf":
self.suche_auf_baubeschlag()
elif webseite == "IPS: Verbindungs- Befestigungs- Dichtungs- Schlauch-Technik, Gewindefittings, Klemmringverschraubungen, Rohre":
self.suche_auf_ips_shop()
elif webseite == "Brewes: Sicherheitsschilder, Verkehrszeichen, Absperrketten, Prüfplaketten, Lagerkennzeichnung":
self.suche_auf_brewes()
elif webseite == "Delker: Baugeräte,Beschlagsysteme und Sicherheitstechnik,Elektro- & Druckluftwerkzeuge,Betriebseinrichtungen":
self.suche_auf_delker()
elif webseite == "Knauss: Armaturen, Geschirrbrausen, Reinigung, Haushalt, Wellness, Garten":
self.suche_auf_knauss()
elif webseite == "Schildershop24: Beschilderung, Hauseingang, Firma & Gewerbe, KFZ & Straße":
self.suche_auf_schildershop24()
elif webseite == "Häfele: Griffe & Türdrücker, Möbelbeschläge & Wohnraumlösungen, Türbeschläge, Schiebebeschläge & Rollläden":
self.suche_auf_haefele()
elif webseite == "Esmeyer: Besteck & Geschirr, alles für Getränke, gedeckter Tisch, Essen & Trinken":
self.suche_auf_esmeyer()
elif webseite == "Papstar: Bio-Einweggeschirr, Teller & Schalen, Becher & Gläser, Besteck, Fingerfood-Artikel, Servietten":
self.suche_auf_papstar()
elif webseite == "Pacovis: To Go Geschirr, Einweggeschirr Brasserie, Lebensmittelverarbeitung, Lebensmittelverpackungen":
self.suche_auf_pacovis()
elif webseite == "Lusini: Gastrobedarf":
self.suche_auf_lusini()
elif webseite == "Hygi: Reinigungsmittel, Pflegemittel & Waschmittel, Desinfektionsmittel, Besen,Müllsäcke & Haushaltswaren":
self.suche_auf_hygi()
elif webseite == "Tischwelt: Geschirr, Glas, Besteck, Buffet, Tischzubehör, Tischwäsche, Take Away, Geräte, Küchenbedarf, Möbel":
self.suche_auf_tischwelt()
elif webseite == "Schafferer: MARKEN, ESSEN & TRINKEN, WOHNEN & SCHENKEN, KOCHEN & GENIESSE, LUNCH, KINDER, THEMEN":
self.suche_auf_schafferer()
elif webseite == "Gastronomie Kaufhaus: Gastrobedarf":
self.suche_auf_gastronomie_kaufhaus()
elif webseite == "Böttcher: Bürobedarf, Papiere, Folien, Etiketten, Druckerpatronen, Büromöbel & Stahlschränke":
self.suche_auf_boettcher()
elif webseite == "Büroshop24: Papier, Tinte & Toner, Ordner & Mappen, Schreibwaren, Versand, Schulbedarf, Bürobedarf":
self.suche_auf_bueroshop24()
elif webseite == "Buchhandlung am Markt: Bücher":
self.suche_buchhandlung_am_markt()
elif webseite == "Transpak":
self.suche_auf_transpak()
except Exception as e:
print(f"Fehler bei der Suche auf {webseite}: {e}")
def suche_auf_haefele(self):
# URL für die Suche generieren
search_url = 'https://www.haefele.de/'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "inputSearchTerm")))
# Suchbegriff eingeben und Suche starten
search_box = self.driver.find_element(By.ID, "inputSearchTerm")
search_box.clear()
search_box.send_keys(self.search_term)
search_box.send_keys(Keys.RETURN)
def suche_auf_brewes(self, ):
# URL für die Suche generieren
search_url = f'https://www.brewes.de/catalogsearch/result?q={self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "search")))
def suche_auf_conrad(self):
# WebDriver initialisieren
# Such-URL generieren
search_url = f'https://www.conrad.de/search.html?search={self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "header-search")))
# Suchbegriff eingeben
search_box = self.driver.find_element(By.ID, "header-search")
search_box.clear() # Falls vorheriger Text vorhanden ist
search_box.send_keys(self.search_term)
# Enter-Taste drücken
search_box.send_keys(Keys.RETURN)
def suche_auf_contorion(self):
# Such-URL generieren
search_url = f'https://www.contorion.de/suche?q={self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "search-input")))
# Suchbegriff eingeben
search_box = self.driver.find_element(By.ID, "search-input")
search_box.clear() # Falls vorheriger Text vorhanden ist
search_box.send_keys(self.search_term)
# Enter-Taste drücken
search_box.send_keys(Keys.RETURN)
def suche_auf_reichelt(self):
# Such-URL generieren
search_url = f'https://www.reichelt.de/index.html?ACTION=446&LA=446&nbc=1&SEARCH={self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 60).until(EC.presence_of_element_located((By.ID, "searchbutton")))
# Suchbegriff eingeben und Suche starten
search_box = self.driver.find_element(By.ID, "quicksearch_new")
search_box.clear() # Falls vorheriger Text vorhanden ist
search_box.send_keys(self.search_term)
# Formular abschicken
search_button = self.driver.find_element(By.ID, "searchbutton")
search_button.click()
def suche_auf_kosatec(self):
# Such-URL generieren
search_url = f'https://shop.kosatec.de/search?search={self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[name='search']")))
def suche_auf_hornbach(self):
# URL für die Suche generieren
search_url = f'https://www.hornbach.de/s/{self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.NAME, "global_search")))
def suche_auf_gastroteileshop(self):
# URL für die Suche generieren
search_url = f'https://www.gastroteileshop.de/?s={self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
# Warten, bis das Suchfeld sichtbar ist
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "search-input")))
# Suchbegriff eingeben und Suche starten
search_box = self.driver.find_element(By.CLASS_NAME, "search-input")
search_box.clear() # Falls vorheriger Text vorhanden ist
search_box.send_keys(self.search_term)
search_box.send_keys(Keys.RETURN)
def suche_auf_tiroled(self):
# URL für die Suche generieren
search_url = f'https://www.tiroled.com/de/search?search={self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.NAME, "search")))
def suche_auf_megabad(self):
# URL für die Suche generieren
search_url = f'https://www.megabad.com/search/?query=sdyc/#/q/{self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "search-bar-input")))
def suche_auf_baubeschlag(self):
# URL für die Suche generieren
search_url = f'https://www.baubeschlagshop.de/fts.php?criteria={self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "searchcriteria")))
def suche_auf_ips_shop(self):
# URL für die Suche generieren
search_url = f'https://www.ips-kts.com/de/suche?query={self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.NAME, "query")))
def suche_auf_delker(self):
# URL für die Suche generieren
search_url = f'https://www.delker2business.com/nwsearch/execute?query={self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.NAME, "query")))
def suche_auf_knauss(self):
# URL für die Suche generieren
search_url = f'https://knauss.info/dksearch?sSearch={self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.NAME, "sSearch")))
def suche_auf_schildershop24(self):
# URL für die Suche generieren
search_url = f'https://www.schildershop24.de/?action=Query&-query.&query.stichwort=r{self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "search-query-stichwort_neu")))
def suche_auf_esmeyer(self):
# URL für die Suche generieren
search_url = f'https://www.esmeyer-shop.de/search?search={self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.NAME, "search")))
def suche_auf_papstar(self):
# URL für die Suche generieren
search_url = 'https://www.papstar-shop.de/'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "search")))
# Suchbegriff eingeben und Suche starten
search_box = self.driver.find_element(By.ID, "search")
search_box.clear() # Falls vorheriger Text vorhanden ist
search_box.send_keys(self.search_term)
# Enter-Taste drücken, um die Suche zu starten
search_box.send_keys(Keys.RETURN)
def suche_auf_pacovis(self):
# URL für die Suche generieren
search_url = f'https://www.pacovis.com/de-de/suche/1/search={self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "search")))
def suche_auf_lusini(self):
# URL für die Suche generieren
search_url = f'https://www.lusini.com/de-de/search/#q={self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "search-input")))
def suche_auf_hygi(self):
# URL für die Suche generieren
search_url = 'https://www.hygi.de/'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "qbox")))
# Suchbegriff eingeben und Suche starten
search_box = self.driver.find_element(By.ID, "qbox")
search_box.clear() # Falls vorheriger Text vorhanden ist
search_box.send_keys(self.search_term)
# Enter-Taste drücken, um die Suche zu starten
search_box.send_keys(Keys.RETURN)
def suche_auf_tischwelt(self):
# URL für die Suche generieren
search_url = f'https://www.tischwelt.de/shop/Suche/?q={self.search_term}&search=Suchen'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "search")))
def suche_auf_schafferer(self):
# URL für die Suche generieren
search_url = f'https://www.schafferer.de/gastro/Artikel-Suche/?q={self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "quicksearch-input")))
def suche_auf_gastronomie_kaufhaus(self):
# URL für die Suche generieren
search_url = 'https://www.gastronomie-kaufhaus.de/'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "searchParam")))
# Suchbegriff eingeben und Suche starten
search_box = self.driver.find_element(By.ID, "searchParam")
search_box.clear() # Falls vorheriger Text vorhanden ist
search_box.send_keys(self.search_term)
# Enter-Taste drücken, um die Suche zu starten (falls notwendig)
search_box.send_keys(Keys.RETURN)
def suche_auf_boettcher(self):
# URL für die Suche generieren
search_url = f'https://www.bueromarkt-ag.de/Artikelsuche_{self.search_term}.html' # Bitte die tatsächliche URL einsetzen
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "autocomplete-0-input")))
def suche_auf_bueroshop24(self):
# URL für die Suche generieren
search_url = 'https://www.bueroshop24.de/'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "searchTerm")))
# Suchbegriff eingeben und Suche starten
search_box = self.driver.find_element(By.ID, "searchTerm")
search_box.clear() # Falls vorheriger Text vorhanden ist
search_box.send_keys(self.search_term)
# Enter-Taste drücken, um die Suche zu starten (falls notwendig)
search_box.send_keys(Keys.RETURN)
def suche_buchhandlung_am_markt(self):
# URL für die Suche generieren
search_url = f'https://bam-mr.buchkatalog.de/search?q={self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "mobile-search")))
def suche_auf_transpak(self):
# URL für die Suche generieren
search_url = f'https://www.shop.transpak.de/search?sSearch={self.search_term}'
# Webseite aufrufen und auf das vollständige Laden warten
self.driver.get(search_url)
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "form-control")))
try:
# Warten, bis der Ablehnen-Button sichtbar ist
cookie_button = WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located((By.XPATH, "//button[@data-cookiefirst-action='reject']"))
)
# Klicken Sie auf den Ablehnen-Button, um Cookies abzulehnen
cookie_button.click()
except Exception as e:
print(f"Fehler beim Akzeptieren von Cookies: {e}")
categories = ["IT/EDV", "Haustechnik","Küche", "Verwaltung", "Transporte"]
webpages = [
["Reichelt: Technikbedarf", "Kosatec: Elektro Artikel", "Conrad: Technik Marktplatz"],
["Hornbach: Bad, Baustoffe, Holz, Fenster & Türen, Bodenbeläge, Werkzeug, Farben & Tapeten, Garten, Heizen",
"Contorion: Befestigungstechnik, Handwerkzeug, Elektrowerkzeug, Materialbearbeitung, Betriebsausstattung",
"Gastroteile Shop: Geräte/Anwendung, Dichtungs- Elektro- Gas- Wasser-Komponenten, Werkzeuge",
"TiroLED: LED Beleuchtung, Digital Signage",
"Megabad: Badarmaturen, Badkeramik, Badmöbel, Badewannen, Duschwannen, Duschkabine, Badheizkörper",
"Baubeschlagshop: Beschläge, Rollen, installationsbedarf",
"IPS: Verbindungs- Befestigungs- Dichtungs- Schlauch-Technik, Gewindefittings, Klemmringverschraubungen, Rohre",
"Brewes: Sicherheitsschilder, Verkehrszeichen, Absperrketten, Prüfplaketten, Lagerkennzeichnung",
"Delker: Baugeräte,Beschlagsysteme und Sicherheitstechnik,Elektro- & Druckluftwerkzeuge,Betriebseinrichtungen",
"Knauss: Armaturen, Geschirrbrausen, Reinigung, Haushalt, Wellness, Garten",
"Schildershop24: Beschilderung, Hauseingang, Firma & Gewerbe, KFZ & Straße",
"Häfele: Griffe & Türdrücker, Möbelbeschläge & Wohnraumlösungen, Türbeschläge, Schiebebeschläge & Rollläden"],
["Esmeyer: Besteck & Geschirr, alles für Getränke, gedeckter Tisch, Essen & Trinken",
"Papstar: Bio-Einweggeschirr, Teller & Schalen, Becher & Gläser, Besteck, Fingerfood-Artikel, Servietten",
"Pacovis: To Go Geschirr, Einweggeschirr Brasserie, Lebensmittelverarbeitung, Lebensmittelverpackungen",
"Lusini: Gastrobedarf",
"Hygi: Reinigungsmittel, Pflegemittel & Waschmittel, Desinfektionsmittel, Besen,Müllsäcke & Haushaltswaren",
"Tischwelt: Geschirr, Glas, Besteck, Buffet, Tischzubehör, Tischwäsche, Take Away, Geräte, Küchenbedarf, Möbel",
"Schafferer: MARKEN, ESSEN & TRINKEN, WOHNEN & SCHENKEN, KOCHEN & GENIESSE, LUNCH, KINDER, THEMEN",
"Gastronomie Kaufhaus: Gastrobedarf"],
["Böttcher: Bürobedarf, Papiere, Folien, Etiketten, Druckerpatronen, Büromöbel & Stahlschränke",
"Buchhandlung am Markt: Bücher",
"Büroshop24: Papier, Tinte & Toner, Ordner & Mappen, Schreibwaren, Versand, Schulbedarf, Bürobedarf"],
["Transpak"]
]
class WebseitenSucheApp(QWidget):
def __init__(self):
super().__init__()
self.category_webpages_mapping = {category: webpages for category, webpages in zip(categories, webpages)}
self.selected_webpages = {webpage: False for category_webpages in webpages for webpage in category_webpages}
self.search_term = ""
self.driver = None
self.init_ui()
def init_ui(self):
layout = QVBoxLayout()
# Kategorien und Webseiten in zwei vertikalen Spalten
grid_layout = QGridLayout()
# Add category in the first column#############################################################
category = "Haustechnik"
category_label = QLabel(category)
grid_layout.addWidget(category_label, 0, 0, 1, 2)
# Add corresponding webpages in the first column
for row, webpage in enumerate(self.category_webpages_mapping[category]):
checkbox = QCheckBox(webpage)
checkbox.setChecked(self.selected_webpages[webpage])
checkbox.stateChanged.connect(self.make_checkbox_callback(webpage))
green_webpages = ["Hornbach", "Contorion", "Gastroteile Shop", "TiroLED", "Megabad", "Baubeschlagshop" ]
if any(green_webpage in webpage for green_webpage in green_webpages):
checkbox.setStyleSheet("color: green;")
yellow_webpages = ["IPS", "Brewes","Delker", "Knauss", "Schildershop24", "Häfele"]
if any(yellow_webpage in webpage for yellow_webpage in yellow_webpages):
checkbox.setStyleSheet("color: yellow;")
grid_layout.addWidget(checkbox, row + 1, 0, 1, 2)
category = "Küche"
category_label = QLabel(category)
grid_layout.addWidget(category_label, 13, 0, 1, 2)
for row, webpage in enumerate(self.category_webpages_mapping[category]):
checkbox = QCheckBox(webpage)
checkbox.setChecked(self.selected_webpages[webpage])
checkbox.stateChanged.connect(self.make_checkbox_callback(webpage))
green_webpages = ["Esmeyer", "Papstar", "Pacovis", "Lusini", "Hygi", "Tischwelt", "Schafferer", "Gastronomie Kaufhaus"]
if any(green_webpage in webpage for green_webpage in green_webpages):
checkbox.setStyleSheet("color: green;")
yellow_webpages = []
if any(yellow_webpage in webpage for yellow_webpage in yellow_webpages):
checkbox.setStyleSheet("color: yellow;")
grid_layout.addWidget(checkbox, row + 14, 0, 1, 2)
# Add "IT/EDV" category in the second column#############################################################
category = "IT/EDV"
category_label = QLabel(category)
grid_layout.addWidget(category_label, 0, 2, 1, 2)
# Add corresponding webpages in the second column
for row, webpage in enumerate(self.category_webpages_mapping[category]):
checkbox = QCheckBox(webpage)
checkbox.setChecked(self.selected_webpages[webpage])
checkbox.stateChanged.connect(self.make_checkbox_callback(webpage))
green_webpages = ["Reichelt", "Kosatec" ]
if any(green_webpage in webpage for green_webpage in green_webpages):
checkbox.setStyleSheet("color: green;")
yellow_webpages = ["Conrad"]
if any(yellow_webpage in webpage for yellow_webpage in yellow_webpages):
checkbox.setStyleSheet("color: yellow;")
grid_layout.addWidget(checkbox, row+ 1, 2, 1, 2)
category = "Verwaltung"
category_label = QLabel(category)
grid_layout.addWidget(category_label, 4, 2, 1, 2)
# Add corresponding webpages in the second column
for row, webpage in enumerate(self.category_webpages_mapping[category]):
checkbox = QCheckBox(webpage)
checkbox.setChecked(self.selected_webpages[webpage])
checkbox.stateChanged.connect(self.make_checkbox_callback(webpage))
green_webpages = []
if any(green_webpage in webpage for green_webpage in green_webpages):
checkbox.setStyleSheet("color: green;")
yellow_webpages = []
if any(yellow_webpage in webpage for yellow_webpage in yellow_webpages):
checkbox.setStyleSheet("color: yellow;")
grid_layout.addWidget(checkbox, row+ 5, 2, 1, 2)
##########################################################################################################################
layout.addLayout(grid_layout)
# Suchbegriff-Eingabe
search_label = QLabel("Geben Sie den Suchbegriff ein:")
layout.addWidget(search_label)
search_input = QLineEdit(self)
search_input.textChanged.connect(self.update_search_term)
layout.addWidget(search_input)
# Suchen-Button
search_button = QPushButton("Suche starten", self)
search_button.clicked.connect(self.start_search)
layout.addWidget(search_button)
# Neues Suche-Button
new_search_button = QPushButton("Neue Suche starten", self)
new_search_button.clicked.connect(self.new_search)
layout.addWidget(new_search_button)
self.setLayout(layout)
self.setGeometry(300, 300, 400, 200)
self.setWindowTitle('Webseiten Suche App')
self.show()
def make_checkbox_callback(self, webpage):
def checkbox_callback(state):
self.update_webpage_state(webpage, state)
return checkbox_callback
def update_webpage_state(self, webpage, state):
self.selected_webpages[webpage] = state == 2 # 2 entspricht dem Zustand "ausgewählt"
def update_search_term(self, text):
self.search_term = text
def start_search(self):
selected_webpages = [webpage for webpage, selected in self.selected_webpages.items() if selected]
if not selected_webpages:
QMessageBox.warning(self, "Fehler", "Bitte wählen Sie mindestens eine Webseite aus.")
return
if not self.search_term:
QMessageBox.warning(self, "Fehler", "Bitte geben Sie einen Suchbegriff ein.")
return
# Starte den Such-Thread
self.search_thread = SearchThread(selected_webpages, self.search_term)
self.search_thread.search_finished.connect(self.search_finished)
self.search_thread.start()
def search_finished(self):
self.search_thread.quit()
self.search_thread.wait()
if hasattr(self.search_thread, 'error_message') and self.search_thread.error_message:
QMessageBox.critical(None, "Fehler", self.search_thread.error_message)
def new_search(self):
self.close_driver()
print("Neue Suche starten")
if __name__ == '__main__':
app = QApplication(sys.argv)
window = WebseitenSucheApp()
sys.exit(app.exec_())