روبیکا من : https://rubika.ir/artinkarimian3 سایت من : https://sites.google.com/view/artin-karimian
ساخت یک موتور جست و جو با پایتون

خب سلام برای امروز به وسایل زیر نیاز داریم .
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
مطلبی دیگر از این انتشارات
سرور چیست؟ – آنچه باید بدانید به زبان ساده
مطلبی دیگر از این انتشارات
اسکریپت چیست ، چه کاربرد و انواعی دارد؟ – به زبان ساده
مطلبی دیگر از این انتشارات
پایتون چیست و چه کاربردی دارد؟ – به زبان ساده