Can an .exe installer be created for the following code?

"Complete Minified Python Code

import sys, asyncio, traceback
from dataclasses import dataclass, field
from typing import List
from PyQt5.QtWidgets import QApplication, QWidget, QComboBox, QLineEdit, QPushButton, QVBoxLayout, QLabel, QMessageBox, QProgressBar
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, WebDriverException, TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager

@dataclass
class AIPlatform:
    name: str
    url: str
    input_selector: str
    submit_selector: str = ""

class PromptManager(QThread):
    success = pyqtSignal(str)
    error = pyqtSignal(str)
    def __init__(self, platform: AIPlatform, prompt: str):
        super().__init__()
        self.platform = platform
        self.prompt = prompt
    def run(self):
        try:
            options = webdriver.ChromeOptions()
            options.add_argument("--start-maximized")
            driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
            driver.get(self.platform.url)
            wait = WebDriverWait(driver, 20)
            input_elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, self.platform.input_selector)))
            input_elem.clear()
            input_elem.send_keys(self.prompt)
            if self.platform.submit_selector:
                submit_elem = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, self.platform.submit_selector)))
                submit_elem.click()
            self.success.emit(f"Prompt injected into {self.platform.name}.")
        except Exception as e:
            tb = traceback.format_exc()
            self.error.emit(f"Error: {str(e)}\n{tb}")
        finally:
            try:
                driver.quit()
            except:
                pass

class MainWindow(QWidget):
    def __init__(self, platforms: List[AIPlatform]):
        super().__init__()
        self.setWindowTitle("AI Prompt Library")
        self.setGeometry(100, 100, 400, 200)
        self.platforms = platforms
        self.init_ui()
    def init_ui(self):
        layout, self.progress = QVBoxLayout(), QProgressBar()
        self.ai_combo = QComboBox(); self.ai_combo.addItems([p.name for p in self.platforms])
        self.prompt_input = QLineEdit(); self.prompt_input.setPlaceholderText("Type your prompt here...")
        self.submit_btn = QPushButton("Submit Prompt"); self.submit_btn.clicked.connect(self.submit_prompt)
        self.status_label = QLabel("")
        layout.addWidget(QLabel("Select AI Platform:"))
        layout.addWidget(self.ai_combo)
        layout.addWidget(QLabel("Enter your prompt:"))
        layout.addWidget(self.prompt_input)
        layout.addWidget(self.submit_btn)
        layout.addWidget(self.progress)
        layout.addWidget(self.status_label)
        self.setLayout(layout)
    def submit_prompt(self):
        ai_name, prompt = self.ai_combo.currentText(), self.prompt_input.text().strip()
        if not prompt:
            QMessageBox.warning(self, "Input Error", "Please enter a prompt.")
            return
        platform = next((p for p in self.platforms if p.name == ai_name), None)
        if not platform:
            QMessageBox.critical(self, "Error", "Selected AI platform not found.")
            return
        self.submit_btn.setEnabled(False); self.progress.setRange(0,0); self.status_label.setText("Processing...")
        self.manager = PromptManager(platform, prompt)
        self.manager.success.connect(self.on_success)
        self.manager.error.connect(self.on_error)
        self.manager.start()
    def on_success(self, message):
        self.submit_btn.setEnabled(True); self.progress.setRange(0,1); self.progress.setValue(0)
        self.status_label.setText(message)
        QMessageBox.information(self, "Success", message)
    def on_error(self, message):
        self.submit_btn.setEnabled(True); self.progress.setRange(0,1); self.progress.setValue(0)
        self.status_label.setText("An error occurred.")
        QMessageBox.critical(self, "Error", message)

def main():
    platforms = [
        AIPlatform(
            name="ChatGPT",
            url="https://chat.openai.com/",
            input_selector="textarea",  # Update as per actual selector
            submit_selector=""  # Update if necessary
        ),
        AIPlatform(
            name="Google Bard",
            url="https://bard.google.com/",
            input_selector="textarea",  # Update as per actual selector
            submit_selector=""  # Update if necessary
        )
    ]
    app, window = QApplication(sys.argv), MainWindow(platforms)
    window.show(); sys.exit(app.exec_())

if __name__ == "__main__":
    main()"