Make your own web browser in Python using PyQt5!

·

2 min read

Code

# importing required libraries
from PyQt5.QtCore import * 
from PyQt5.QtWidgets import * 
from PyQt5.QtGui import * 
from PyQt5.QtWebEngineWidgets import * 
from PyQt5.QtPrintSupport import * 
import os
import sys

# main window
class MainWindow(QMainWindow):

    # constructor
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.tabs = QTabWidget()
        self.tabs.setDocumentMode(True)
        self.tabs.tabBarDoubleClicked.connect(self.tab_open_doubleclick)
        self.tabs.currentChanged.connect(self.current_tab_changed)
        self.tabs.setTabsClosable(True)
        self.tabs.tabCloseRequested.connect(self.close_current_tab)
        self.setCentralWidget(self.tabs)
        self.status = QStatusBar()
        self.setStatusBar(self.status)
        self.showMaximized()
        self.setWindowIcon(QIcon('https://media.discordapp.net/attachments/773966287915188294/824996426417176586/bird.png'))        

        navtb = QToolBar("Navigation")

        self.addToolBar(navtb)

        back_btn = QAction("<", self)

        back_btn.setStatusTip("Back to previous page")


        back_btn.triggered.connect(lambda: self.tabs.currentWidget().back())

        navtb.addAction(back_btn)

        next_btn = QAction(">", self)
        next_btn.setStatusTip("Forward to next page")
        next_btn.triggered.connect(lambda: self.tabs.currentWidget().forward())
        navtb.addAction(next_btn)

        reload_btn = QAction("⟲", self)
        reload_btn.setStatusTip("Reload page")
        reload_btn.triggered.connect(lambda: self.tabs.currentWidget().reload())
        navtb.addAction(reload_btn)

        home_btn = QAction("☖", self)
        home_btn.setStatusTip("Go home")

        home_btn.triggered.connect(self.navigate_home)
        navtb.addAction(home_btn)

        navtb.addSeparator()

        self.urlbar = QLineEdit()

        self.urlbar.returnPressed.connect(self.navigate_to_url)

        navtb.addWidget(self.urlbar)

        self.add_new_tab(QUrl('https://google.com/'), 'Homepage')

        self.show()

        self.setWindowTitle("Bird Engine")

        yt_btn = QAction('Y', self)
        yt_btn.setStatusTip("Go to YouTube")
        yt_btn.triggered.connect(self.yt_url)
        navtb.addAction(yt_btn)

        tw_btn = QAction('T', self)
        tw_btn.setStatusTip("Go to Twitter")
        tw_btn.triggered.connect(self.tw_url)
        navtb.addAction(tw_btn)

        ig_btn = QAction('I', self)
        ig_btn.setStatusTip("Go to Instagram")
        ig_btn.triggered.connect(self.ig_url)
        navtb.addAction(ig_btn)

        rd_btn = QAction('R', self)
        rd_btn.setStatusTip("Go to Reddit")
        rd_btn.triggered.connect(self.rd_url)
        navtb.addAction(rd_btn)

        gm_btn = QAction('G', self)
        gm_btn.setStatusTip("Go to Gmail")
        gm_btn.triggered.connect(self.gm_url)
        navtb.addAction(gm_btn)

        info_btn = QAction('?', self)
        info_btn.triggered.connect(self.info_url)
        navtb.addAction(info_btn)

    def info_url(self):
        self.tabs.currentWidget().setUrl(QUrl("https://google.com/"))
    def yt_url(self):
        self.tabs.currentWidget().setUrl(QUrl("https://youtube.com/"))
    def tw_url(self):
        self.tabs.currentWidget().setUrl(QUrl("https://twitter.com/"))
    def ig_url(self):
        self.tabs.currentWidget().setUrl(QUrl("https://instagram.com/"))
    def rd_url(self):
        self.tabs.currentWidget().setUrl(QUrl("https://reddit.com/"))
    def gm_url(self):
        self.tabs.currentWidget().setUrl(QUrl("https://gmail.com/"))



    def add_new_tab(self, qurl = None, label ="Blank"):

        if qurl is None:
            qurl = QUrl('https://google.com/')

        browser = QWebEngineView()

        browser.setUrl(qurl)

        i = self.tabs.addTab(browser, label)
        self.tabs.setCurrentIndex(i)

        browser.urlChanged.connect(lambda qurl, browser = browser:
                                   self.update_urlbar(qurl, browser))

        browser.loadFinished.connect(lambda _, i = i, browser = browser:
                                     self.tabs.setTabText(i, browser.page().title()))

    def tab_open_doubleclick(self, i):

        if i == -1:
            self.add_new_tab()

    def current_tab_changed(self, i):

        qurl = self.tabs.currentWidget().url()

        self.update_urlbar(qurl, self.tabs.currentWidget())

        self.update_title(self.tabs.currentWidget())

    def close_current_tab(self, i):

        if self.tabs.count() < 2:
            return

        self.tabs.removeTab(i)

    def update_title(self, browser):

        if browser != self.tabs.currentWidget():
            return

        title = self.tabs.currentWidget().page().title()

        self.setWindowTitle("% s - Bird Engine " % title)

    def navigate_home(self):

        self.tabs.currentWidget().setUrl(QUrl("https://google.com/"))

    def navigate_to_url(self):

        q = QUrl(self.urlbar.text())

        if q.scheme() == "":
            q.setScheme("http")
        self.tabs.currentWidget().setUrl(q)

    def update_urlbar(self, q, browser = None):

        if browser != self.tabs.currentWidget():

            return

        self.urlbar.setText(q.toString())

        self.urlbar.setCursorPosition(0)

app = QApplication(sys.argv)
QApplication.setApplicationName('Bird Engine')
window = MainWindow()
app.exec_()