روبیکا من : 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
مطلبی دیگر از این انتشارات
نصب کتابخانه آرتین کریمیان
مطلبی دیگر از این انتشارات
ساخت یک آنتی ویروس به نام Chitartin با پایتون
مطلبی دیگر از این انتشارات
پروژه اول با پایتون : ردیابی شماره موبایل