ساخت یک موتور جست و جو با پایتون

خب سلام برای امروز به وسایل زیر نیاز داریم .

1- پایتون

2- کتابخانه sys

3- کتابخانه PyQt5.QtCore

4- کتابخانه PyQt5.QtGui

5- کتابخانه PyQt5.QtWidgets

6- کتابخانه PyQt5.QtWebEngineWidgets

خب حالا پایتون را باز میکنیم و کد زیر را وارد میکنیم .

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *

# --- بخش نقاشی آیکون‌ها ---
def paint_custom_icon(kind, size=32):
    """
    این تابع مثل یک نقاش عمل می‌کند. 
    به جای خواندن فایل، با دستورات ریاضی شکل‌ها را می‌کشد.
    """
    pixmap = QPixmap(size, size)
    pixmap.fill(Qt.transparent) # پس‌زمینه شفاف

    painter = QPainter(pixmap)
    painter.setRenderHint(QPainter.Antialiasing) # برای اینکه لبه‌ها نرم و زیبا باشند

    # تنظیمات قلم (Pen) برای رسم خطوط
    pen = QPen(QColor("#333333")) 
    pen.setWidth(3)
    pen.setCapStyle(Qt.RoundCap)
    painter.setPen(pen)

    center = size // 2

    if kind == "back":
        # رسم فلش رو به چپ با خطوط و گوشه‌ها
        painter.drawLine(center + 6, center, center - 8, center)
        painter.drawLine(center - 8, center, center - 2, center - 6)
        painter.drawLine(center - 8, center, center - 2, center + 6)

    elif kind == "forward":
        # رسم فلش رو به راست
        painter.drawLine(center - 6, center, center + 8, center)
        painter.drawLine(center + 8, center, center + 2, center - 6)
        painter.drawLine(center + 8, center, center + 2, center + 6)

    elif kind == "reload":
        # رسم یک فلش دایره‌ای (چرخشی)
        rect = QRectF(6, 6, size-12, size-12)
        painter.drawArc(rect, -30 * 16, 270 * 16)
        # نوک فلش
        painter.drawLine(center + 8, 8, center + 12, 12)
        painter.drawLine(center + 12, 12, center + 10, 18)

    elif kind == "home":
        # رسم شکل خانه با چند خط ساده
        painter.drawLine(size//4, size - 8, size - size//4, size - 8) # کف خانه
        painter.drawLine(size//4, size - 8, size//4, size//2)       # دیوار چپ
        painter.drawLine(size - size//4, size - 8, size - size//4, size//2) # دیوار راست
        painter.drawLine(size//4, size//2, size//2, size//4)       # سقف چپ
        painter.drawLine(size//2, size//4, size - size//4, size//2) # سقف راست

    elif kind == "add":
        # رسم علامت + با دو خط متقاطع
        painter.drawLine(center, size//4, center, size - size//4)
        painter.drawLine(size//4, center, size - size//4, center)

    painter.end()
    return QIcon(pixmap)

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        # 1. تغییر اسم برنامه و پنجره
        self.setWindowTitle("Artin Karimian's search engine")
        QApplication.setApplicationName('Artin Karimian\'s search engine')

        # ایجاد تب‌ها
        self.tabs = QTabWidget()
        self.tabs.setTabsClosable(True)   # دکمه بستن تب
        self.tabs.setMovable(True)        # قابلیت جابه‌جایی تب‌ها
        self.tabs.tabCloseRequested.connect(self.close_tab)

        self.setCentralWidget(self.tabs)
        self.showMaximized()

        self.home_url = "https://virgool.io/@artinkarimian"
        # 2. تغییر اسم تب اولیه
        self.add_new_tab(self.home_url, "Home Tab") 

        # نوار ابزار (Toolbar)
        navbar = QToolBar()
        self.addToolBar(navbar)

        # اضافه کردن دکمه‌ها با آیکون‌های نقاشی شده
        self.back_btn = QAction(paint_custom_icon("back"), '', self)
        self.back_btn.triggered.connect(self.go_back)
        navbar.addAction(self.back_btn)

        self.forward_btn = QAction(paint_custom_icon("forward"), '', self)
        self.forward_btn.triggered.connect(self.go_forward)
        navbar.addAction(self.forward_btn)

        self.reload_btn = QAction(paint_custom_icon("reload"), '', self)
        self.reload_btn.triggered.connect(self.reload_page)
        navbar.addAction(self.reload_btn)

        self.home_btn = QAction(paint_custom_icon("home"), '', self)
        self.home_btn.triggered.connect(self.navigate_home)
        navbar.addAction(self.home_btn)

        self.new_tab_btn = QAction(paint_custom_icon("add"), '', self)
        self.new_tab_btn.triggered.connect(self.add_new_tab)
        navbar.addAction(self.new_tab_btn)

        # نوار جستجو
        self.search_bar = QLineEdit()
        self.search_bar.returnPressed.connect(self.search)
        navbar.addWidget(self.search_bar)

    # --- متدهای عملکردی ---
    def add_new_tab(self, url=None, title="New Tab"): # عنوان تب پیش‌فرض "New Tab" باقی می‌ماند
        browser = QWebEngineView()
        if url:
            browser.setUrl(QUrl(url))
        else:
            browser.setUrl(QUrl("https://www.google.com"))
        
        tab_index = self.tabs.addTab(browser, title) # اینجا عنوان تب تعیین می‌شود
        self.tabs.setCurrentIndex(tab_index)
        browser.urlChanged.connect(self.update_url)

    def close_tab(self, index):
        # اجازه نده آخرین تب بسته شود
        if self.tabs.count() > 1:
            widget = self.tabs.widget(index)
            self.tabs.removeTab(index)
            if widget:
                widget.deleteLater()

    def go_back(self):
        if self.tabs.currentWidget(): self.tabs.currentWidget().back()

    def go_forward(self):
        if self.tabs.currentWidget(): self.tabs.currentWidget().forward()

    def reload_page(self):
        if self.tabs.currentWidget(): self.tabs.currentWidget().reload()

    def navigate_home(self):
        if self.tabs.currentWidget(): self.tabs.currentWidget().setUrl(QUrl(self.home_url))

    def search(self):
        url_text = self.search_bar.text()
        current_tab = self.tabs.currentWidget()
        
        if not current_tab:
            return

        if "http" in url_text or "https://" in url_text or "about:blank" in url_text:
            # آدرس معتبر است، مستقیماً برو
            current_tab.setUrl(QUrl(url_text))
        else:
            # یک عبارت جستجو است، با گوگل جستجو کن
            search_url = f"https://www.google.com/search?q={url_text}"
            current_tab.setUrl(QUrl(search_url))
            self.search_bar.setText(search_url) # نوار جستجو را هم آپدیت کن

    def update_url(self, q):
        # این تابع فعلاً فقط نوار جستجو را آپدیت می‌کند.
        self.search_bar.setText(q.toString())


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show() # پنجره را نمایش بده
    app.exec_()

خب اینم از پروژه امروز ما .

کانال روبیکا من : کانال روبیکا من : https://rubika.ir/artinkarimian3

اگر ایده یا پروژه ای دارید از طریق لینک زیر :
https://formafzar.com/form/zso58
پیام خود را وارد کنید راستی به تمام سوالات شما پاسخ داده میشود .

رمز داخل سایت (جهت نیاز) : artinkarimian125701