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 sqlite3 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": self.suche_auf_reichelt() elif webseite == "Conrad": self.suche_auf_conrad() elif webseite == "Kosatec": self.suche_auf_kosatec() elif webseite == "Hornbach": self.suche_auf_hornbach() elif webseite =="Contorion": self.suche_auf_contorion() elif webseite == "Gastroteile Shop": self.suche_auf_gastroteileshop() elif webseite == "TiroLED": self.suche_auf_tiroled() elif webseite == "Megabad": self.suche_auf_megabad() elif webseite == "Baubeschlagshop": self.suche_auf_baubeschlag() elif webseite == "IPS": self.suche_auf_ips_shop() elif webseite == "Brewes": self.suche_auf_brewes() elif webseite == "Delker": self.suche_auf_delker() elif webseite == "Knauss": self.suche_auf_knauss() elif webseite == "Schildershop24": self.suche_auf_schildershop24() elif webseite == "Häfele": self.suche_auf_haefele() elif webseite == "Esmeyer": self.suche_auf_esmeyer() elif webseite == "Papstar": self.suche_auf_papstar() elif webseite == "Pacovis": self.suche_auf_pacovis() elif webseite == "Lusini": self.suche_auf_lusini() elif webseite == "Hygi": self.suche_auf_hygi() elif webseite == "Tischwelt": self.suche_auf_tischwelt() elif webseite == "Schafferer": self.suche_auf_schafferer() elif webseite == "Gastronomie Kaufhaus": self.suche_auf_gastronomie_kaufhaus() elif webseite == "Arbeitsplatzmatten Profi": self.suche_auf_arbeitsplatzmattenprofi() elif webseite == "Skiltex": self.suche_auf_skiltex() elif webseite == "Franz-Mensch": self.suche_auf_franzmensch() elif webseite == "Frank-Flechtwaren": self.suche_auf_frankflechtwaren() elif webseite == "ARA": self.suche_auf_ara_arbeitsschutz() elif webseite == "VKF-Renzel": self.suche_auf_vkf_renzel() elif webseite == "Börner": self.suche_auf_boerner() elif webseite == "GGM-Gastro": self.suche_auf_ggmgastro() elif webseite == "Böttcher": self.suche_auf_boettcher() elif webseite == "Büroshop24": self.suche_auf_bueroshop24() elif webseite == "Buchhandlung am Markt": self.suche_buchhandlung_am_markt() elif webseite == "Label-Ident": self.suche_auf_labelident() elif webseite == "Transpak": self.suche_auf_transpak() elif webseite == "PM": self.suche_auf_pml() elif webseite == "DM-Folien": self.suche_auf_dmfolien() elif webseite == "Proficleanshop": self.suche_auf_proficleanshop() elif webseite == "Siepmann": self.suche_auf_siepmann() elif webseite == "FK-Söhnchen": self.suche_auf_fksoehnchen() elif webseite == "Wahl-Agar": self.suche_auf_wahl_agrar() elif webseite == "TVV-Verpackungen": self.suche_auf_tvv() elif webseite == "Eierschachteln.de": self.suche_auf_eierschachteln() elif webseite == "KOX": self.suche_auf_kox() elif webseite == "Reinigungsberater.de": self.suche_auf_reinigungsberater() elif webseite == "VBS-Hobby": self.suche_auf_vbshobby() elif webseite == "Ökonomed": self.suche_auf_oekonomed() elif webseite == "Rossmann": self.suche_auf_rossmann() elif webseite == "Betzold": self.suche_auf_betzold() 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 self.driver.get(search_url) def suche_auf_conrad(self): # Such-URL generieren search_url = f'https://www.conrad.de/search.html?search={self.search_term}' # Webseite aufrufen self.driver.get(search_url) # 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 self.driver.get(search_url) cookie_button = self.driver.find_element(By.ID, "CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll") cookie_button.click() def suche_auf_hornbach(self): # URL für die Suche generieren search_url = f'https://www.hornbach.de/s/{self.search_term}' # Webseite aufrufen self.driver.get(search_url) 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"))) cookie_button = self.driver.find_element(By.CLASS_NAME, "btn.btn-primary.btn-block.btn-appearance") cookie_button.click() # 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 self.driver.get(search_url) cookie_button = self.driver.find_element(By.CLASS_NAME, "cookie-consent-accept-only-functional-button.btn.btn-primary.cookie-consent-button-margin") cookie_button.click() 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) cookie_button = self.driver.find_element(By.CSS_SELECTOR, ".cmpboxbtn.cmpboxbtnyes.cmptxt_btn_yes") cookie_button.click() 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 self.driver.get(search_url) 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 self.driver.get(search_url) cookie_button = self.driver.find_element(By.CLASS_NAME, "btn.btn-primary.btn-red.user-type--business") cookie_button.click() 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 self.driver.get(search_url) def suche_auf_knauss(self): # URL für die Suche generieren search_url = f'https://knauss.info/dksearch?sSearch={self.search_term}' # Webseite aufrufen self.driver.get(search_url) cookie_button = self.driver.find_element(By.CLASS_NAME, "cookie-permission--decline-button.btn.is--large.is--center") cookie_button.click() 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 self.driver.get(search_url) cookie_button = self.driver.find_element(By.CLASS_NAME, "btn.btn-primary.button.set-disabled") cookie_button.click() 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 self.driver.get(search_url) cookie_button = self.driver.find_element(By.CLASS_NAME, "cookie-permission-button.js-cookie-permission-button") cookie_button.click() 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 self.driver.get(search_url) 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 self.driver.get(search_url) 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"))) cookie_button = self.driver.find_element(By.CLASS_NAME, "btn.btn-light.text-nowrap.btn-block.mb-2") cookie_button.click() # 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) 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) 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_arbeitsplatzmattenprofi(self): # URL für die Suche generieren search_url = f'https://arbeitsplatzmatten-profi.com/?s={self.search_term}' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) cookie_button = self.driver.find_element(By.ID, "CookieBoxSaveButton") cookie_button.click() def suche_auf_skiltex(self): search_url = 'https://www.skiltex.de/shop/frontpage.html' # Ersetzen Sie dies durch die tatsächliche URL für Skiltex # 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, "SearchField_SearchPage"))) cookie_button = self.driver.find_element(By.CLASS_NAME, "coi-banner__accept") cookie_button.click() # Auf die Suchleiste klicken search_box = self.driver.find_element(By.CLASS_NAME, "SearchField_SearchPage") search_box.click() # Suchbegriff eingeben und Suche starten search_box.clear() search_box.send_keys(self.search_term) search_box.send_keys(Keys.RETURN) WebDriverWait(self.driver, 20).until(EC.presence_of_element_located((By.CLASS_NAME, "popuptype.fancybox-content"))) kunde = self.driver.find_element(By.CLASS_NAME, "popuptype_knap_erhverv.moms_off") kunde.click() def suche_auf_franzmensch(self): # URL für die Suche generieren search_url = f'https://www.franz-mensch.de/search?search={self.search_term}' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) def suche_auf_frankflechtwaren(self): # URL für die Suche generieren search_url = f'https://www.frank-flechtwaren.de/suchergebnisse/?query={self.search_term}' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) def suche_auf_ara_arbeitsschutz(self): # URL für die Suche generieren search_url = f'https://ara-arbeitsschutz.de/navi.php?qs={self.search_term}' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) cookie_button = self.driver.find_element(By.CLASS_NAME, "cmpboxbtn.cmpboxbtnno.cmptxt_btn_no") cookie_button.click() def suche_auf_vkf_renzel(self): # URL für die Suche generieren search_url = f'https://www.vkf-renzel.de/index.php?lang=0&cl=rasearch&searchparam={self.search_term}' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) def suche_auf_boerner(self): # URL für die Suche generieren search_url = f'https://www.boerner.de/?s={self.search_term}' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) cookie_button = self.driver.find_element(By.ID, "CookieBoxSaveButton") cookie_button.click() def suche_auf_ggmgastro(self): # URL für die Suche generieren search_url = f'https://www.ggmgastro.com/de-de-eur/search?q={self.search_term}' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) cookie_button = self.driver.find_element(By.CLASS_NAME, "cf1y60") cookie_button.click() 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_labelident(self): # URL für die Suche generieren search_url = f'https://www.labelident.com/catalogsearch/result/?q={self.search_term}' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) cookie_button = self.driver.find_element(By.CLASS_NAME, "cmpboxbtn.cmpboxbtnno.cmptxt_btn_no") cookie_button.click() kunde = self.driver.find_element(By.CLASS_NAME, "btn.btn-blue-outline.redir-mask") kunde.click() 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}") def suche_auf_pml(self): # URL für die Suche generieren search_url = f'https://www.pml-papiere.de/#query={self.search_term}' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) def suche_auf_dmfolien(self): # URL für die Suche generieren search_url = f'https://www.dm-folien.com/shop/search?sSearch={self.search_term}' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) def suche_auf_proficleanshop(self): # URL für die Suche generieren search_url = f'https://www.proficleanshop.de/searchresults/?q={self.search_term}' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) kunde = self.driver.find_element(By.CLASS_NAME, "buttonTaxConfirm.fsize14.white") kunde.click() cookie_button = self.driver.find_element(By.CLASS_NAME, "cf1lHZ.cf2MAH") cookie_button.click() def suche_auf_siepmann(self): # URL für die Suche generieren search_url = f'https://www.siepmann.net/siepmann_shop.php?suchfeld={self.search_term}' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) def suche_auf_fksoehnchen(self): # URL für die Suche generieren search_url = f'https://www.fk-soehnchen.de/index.php?lang=0&cl=search&searchparam={self.search_term}' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) def suche_auf_wahl_agrar(self): # URL für die Suche generieren search_url = 'https://www.agrar-fachversand.com/de/' # Ersetzen Sie dies durch die tatsächliche URL für Wahl Agrar # 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, "main-search--field"))) # Auf die Suchleiste klicken search_box = self.driver.find_element(By.CLASS_NAME, "main-search--field") search_box.click() # Suchbegriff eingeben und Suche starten search_box.clear() search_box.send_keys(self.search_term) search_box.send_keys(Keys.RETURN) def suche_auf_tvv(self): # URL für die Suche generieren search_url = f'https://www.tvv-verpackungen.de/index.php?jtl_token=86147d041429ad7dafb0c5f1a80e61e089eb4f04ec192b004ba5e69e8aaa45c5&sp_additional_mail=&qs={self.search_term}' # Ersetzen Sie dies durch die tatsächliche URL für DVV # 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-header-mobile-top"))) cookie_button = self.driver.find_element(By.CLASS_NAME, "cmpboxbtn.cmpboxbtnno.cmptxt_btn_no") cookie_button.click() def suche_auf_eierschachteln(self): # URL für die Suche generieren search_url = f'https://www.eierschachteln.de/search?sSearch={self.search_term}' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) cookie_button = self.driver.find_element(By.ID, "cookie-permission--accept-only-functional-button") cookie_button.click() def suche_auf_kox(self): # URL für die Suche generieren search_url = f'https://www.kox-direct.de/?query={self.search_term}&sid=6d0b4366af8bb99af514529b7e61ad&act=search' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) cookie_button = self.driver.find_element(By.CLASS_NAME, "od-btn-white.bg-gray-lightest.w-full.mb-4.set_essential_cookies") cookie_button.click() def suche_auf_reinigungsberater(self): # URL für die Suche generieren search_url = f'https://www.reinigungsberater.de/{self.search_term}.html' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) cookie_button = self.driver.find_element(By.CLASS_NAME, "acceptMe") cookie_button.click() def suche_auf_vbshobby(self): # URL für die Suche generieren search_url = f'https://www.vbs-hobby.com/suche/?q={self.search_term}' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) def suche_auf_oekonomed(self): # URL für die Suche generieren search_url = f'https://shop.oekonomed.de/de/advanced_search_result.php?keywords={self.search_term}&inc_subcat=1' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) cookie_button = self.driver.find_element(By.CLASS_NAME, "as-oil-l-item") cookie_button.click() def suche_auf_rossmann(self): # URL für die Suche generieren search_url = f'https://www.rossmann.de/de/search/?text={self.search_term}' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) def suche_auf_betzold(self): # URL für die Suche generieren search_url = f'https://www.betzold.de/search/?q={self.search_term}' # Webseite aufrufen und auf das vollständige Laden warten self.driver.get(search_url) class WebseitenSucheApp(QWidget): def __init__(self): super().__init__() self.categories, self.webpages = self.get_categories_and_webpages() self.checkbox_states = {webpage: False for category_webpages in self.webpages for webpage in category_webpages} self.search_term = "" self.driver = None self.init_ui() def get_categories_and_webpages(self): connection = sqlite3.connect('webseiten.db') cursor = connection.cursor() cursor.execute("SELECT name FROM categories") categories = [row[0] for row in cursor.fetchall()] webpages = [] for category in categories: cursor.execute("SELECT name FROM webpages WHERE category_id = (SELECT id FROM categories WHERE name = ?)", (category,)) webpages.append([row[0] for row in cursor.fetchall()]) # Verbindung schließen connection.close() return categories, webpages # ... def init_ui(self): self.setStyleSheet("background-color: black; color: white;") layout = QVBoxLayout() # Kategorien und Webseiten in zwei vertikalen Spalten grid_layout = QGridLayout() grid_layout.setVerticalSpacing(5) # ... # Add category in the first grid############################################################# num_columns = 2 # Anzahl der Spalten for idx, category in enumerate(self.categories): category_label = QLabel(category) # Webseiten für die aktuelle Kategorie connection = sqlite3.connect('webseiten.db') cursor = connection.cursor() cursor.execute("SELECT name FROM webpages WHERE category_id = (SELECT id FROM categories WHERE name = ?)", (category,)) category_webpages = [row[0] for row in cursor.fetchall()] connection.close() num_webpages = len(category_webpages) # Hier kannst du die Anzahl der Zeilen und die Position für jede Kategorie individuell festlegen num_rows_for_category = max(num_webpages, 1) # Mindestens eine Zeile if category == "Baumarkt": row_position = 0 # Starte die Kategorie "Baumarkt" in der ersten Reihe elif category == "Schilder": row_position = 4 elif category == "Hygiene": row_position = 9 elif category == "Drogentest": row_position = 11 elif category == "Büro Artikel": row_position = 13 elif category == "Küchenbedarf": row_position = 17 elif category == "Landwirtschaft/Garten": row_position = 25 elif category == "Verpackungen": row_position = 11 elif category == "Reinigungs Artikel": row_position = 18 elif category == "Arbeitsschutz": row_position = 23 elif category == "Deko": row_position = 26 else: row_position = idx * (num_rows_for_category + 1) # 1 zusätzliche Zeile für die Kategorie col_position = idx % num_columns grid_layout.addWidget(category_label, row_position, col_position * 2, 1, 2) # Col Position * 2, um den Abstand zu erhöhen for row, webpage in enumerate(category_webpages): checkbox = QCheckBox(webpage) checkbox.setChecked(self.checkbox_states[webpage]) checkbox.stateChanged.connect(self.make_checkbox_callback(webpage)) checkbox.setStyleSheet("color: white; border: 1px solid white;") # Hier kannst du Anpassungen für jede Kategorie vornehmen if category == "IT/Elektronik": green_webpages = ["Reichelt", "Kosatec", "Conrad"] 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;") if category == "Schilder": green_webpages = ["Brewes","Schildershop24","Skiltex","VKF-Renzel"] if any(green_webpage in webpage for green_webpage in green_webpages): checkbox.setStyleSheet("color: green;") if category == "Hygiene": green_webpages = ["Rossmann"] if any(green_webpage in webpage for green_webpage in green_webpages): checkbox.setStyleSheet("color: green;") if category == "Drogentest": green_webpages = ["Ökonomed"] if any(green_webpage in webpage for green_webpage in green_webpages): checkbox.setStyleSheet("color: green;") if category == "Büro Artikel": green_webpages = ["Böttcher","Buchhandlung am Markt"] if any(green_webpage in webpage for green_webpage in green_webpages): checkbox.setStyleSheet("color: green;") yellow_webpages = ["Büroshop24.de"] if any(yellow_webpage in webpage for yellow_webpage in yellow_webpages): checkbox.setStyleSheet("color: yellow;") if category == "Küchenbedarf": green_webpages = ["Esmeyer","Lusini","Tischwelt","Schafferer","Gastronomie Kaufhaus"] if any(green_webpage in webpage for green_webpage in green_webpages): checkbox.setStyleSheet("color: green;") yellow_webpages = ["Börner","GGM-Gastro"] if any(yellow_webpage in webpage for yellow_webpage in yellow_webpages): checkbox.setStyleSheet("color: yellow;") if category == "Landwirtschaft/Garten": green_webpages = ["Siepmann","FK-Söhnchen","Wahl-Agar","KOX"] if any(green_webpage in webpage for green_webpage in green_webpages): checkbox.setStyleSheet("color: green;") if category == "Baumarkt": green_webpages = ["Hornbach","Contorion","Gastroteile Shop","Megabad","Baubeschlagshop","TiroLED"] if any(green_webpage in webpage for green_webpage in green_webpages): checkbox.setStyleSheet("color: green;") yellow_webpages = ["Häfele","Delker","Knauss","IPS"] if any(yellow_webpage in webpage for yellow_webpage in yellow_webpages): checkbox.setStyleSheet("color: yellow;") if category == "Verpackungen": green_webpages = ["Papstar","Pacovis","Transpak","TVV-Verpackungen","Eierschachteln.de","DM-Folien"] if any(green_webpage in webpage for green_webpage in green_webpages): checkbox.setStyleSheet("color: green;") if category == "Reinigungs Artikel": green_webpages = ["Hygi","Proficlean Shop","Reinigungsberater","Franz-Mensch"] if any(green_webpage in webpage for green_webpage in green_webpages): checkbox.setStyleSheet("color: green;") if category == "Arbeitsschutz": yellow_webpages = ["ARA","Arbeitsplatzmatten Profi"] if any(yellow_webpage in webpage for yellow_webpage in yellow_webpages): checkbox.setStyleSheet("color: yellow;") if category == "Deko": green_webpages = ["Frank-Flechtwaren","Betzold","VBS-Hobby"] if any(green_webpage in webpage for green_webpage in green_webpages): checkbox.setStyleSheet("color: green;") if category == "Etiketten/Papier": green_webpages = ["Label-Ident","PML"] if any(green_webpage in webpage for green_webpage in green_webpages): checkbox.setStyleSheet("color: green;") grid_layout.addWidget(checkbox, row + 1 + row_position, col_position * 2, 1, 2) # Setze den Stretch-Faktor für die zusätzliche Zeile zwischen den Kategorien grid_layout.setRowStretch(row_position + num_rows_for_category, 0) ########################################################################################################################## layout.addLayout(grid_layout) self.setLayout(layout) # Suchbegriff-Eingabe self.search_label = QLabel("Geben Sie den Suchbegriff ein:") layout.addWidget(self.search_label) self.search_input = QLineEdit(self) self.search_input.textChanged.connect(self.update_search_term) layout.addWidget(self.search_input) self.search_input.setStyleSheet("color: white; border: 1px solid white;") # Suchen-Button search_button = QPushButton("Suche starten", self) search_button.clicked.connect(self.start_search) layout.addWidget(search_button) search_button.setStyleSheet("color: white; border: 1px solid white;") # Neues Suche-Button new_search_button = QPushButton("Neue Suche starten", self) new_search_button.clicked.connect(self.clear_checkboxes) layout.addWidget(new_search_button) new_search_button.setStyleSheet("color: white; border: 1px solid white;") 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.checkbox_states[webpage] = state == Qt.Checked return checkbox_callback def update_webpage_state(self, webpage, state): self.checkbox_states[webpage] = state for checkbox in self.findChildren(QCheckBox): if checkbox.text() == webpage: checkbox.setChecked(state) def clear_checkboxes(self): for webpage in self.checkbox_states: self.update_webpage_state(webpage, False) self.search_input.clear() def update_search_term(self, text): self.search_term = text def start_search(self): checkbox_states = [webpage for webpage, selected in self.checkbox_states.items() if selected] if not checkbox_states: 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(checkbox_states, 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 keyPressEvent(self, event): if event.key() == Qt.Key_Enter or event.key() == Qt.Key_Return: self.start_search() if __name__ == '__main__': app = QApplication(sys.argv) window = WebseitenSucheApp() sys.exit(app.exec_())