Python制作简易浏览器

Python制作简易浏览器

我的电脑里目前有3个浏览器,分别是Edge、Chrome和Firefox,但它们各有利弊:Edge相对较好,Chrome进程过大,Firefox太丑。因此,为了改善一下我的电脑浏览器,也学习一些PyQt5,PyQtWebEngine相关知识,就开发一款浏览器。

大致设计思路

我的浏览器应该有以下要求:

能正常上网拥有“继续”、“返回”、“刷新”、“主页”、“新建标签页”等功能能看文章、能写文章可以保存cookies

原计划是想用tkinter制作,但发现tkinter好多功能不能实现,经过网上查找了一番后锁定PyQt5和PyQtWebEngine作为主要库

搭建环境

搭建环境这里足足花了我三天三夜!一会儿Python版本过高,一会儿库版本过低,一会儿pip损坏,一会儿PyCharm出问题等。最后把python、pip、PyQt5全删了重装好几遍才好

为了节省你们的时间,我把需要的(本人测试可以成功运行)库和版本号写在这:

环境需要的版本号都在上面了。别看全是最新版,pip就可以搞定就很轻松。还不是网上有人说PyQt5库5.11版本后不再自带PyQWebEngine,需要自己安装。还说PyQt5不能用最新版,需要用5.10.1版本......

设计代码

原计划是自己设计,自己敲。但是发现涉及方面太多了,就把开源的My browser改进一下吧。

首先重新涉及logo、图标等内容。(为了防止自己设计的难看恶心到你们,素材就还用原来的吧)更改浏览器名称更改默认浏览器主页及名称为了配对新的库而重新导入库(原来的代码是1年前的,那时PyQt5还有PyQtWebEngine)对原来的代码进行个性化改造

完整代码

from PyQt5.QtCore import *

from PyQt5.QtWidgets import *

from PyQt5.QtGui import *

from PyQt5.QtWebEngineWidgets import *

import sys

class WebView(QWebEngineView):

def __init__(self, parent):

super().__init__(parent)

def createWindow(self, webWindowType):

return main_demo.browser

class MainDemo(QMainWindow):

def __init__(self, *args, **kwargs):

super().__init__(*args, **kwargs)

self.setWindowTitle('MWB浏览器')

self.setWindowIcon(QIcon('icons/penguin.png'))

self.resize(800, 500)

self.show()

# 添加URL地址栏

self.urlbar = QLineEdit()

# 让地址栏支持输入地址回车访问

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

# 添加标签栏

self.tabs = QTabWidget()

self.tabs.setDocumentMode(True)

self.tabs.tabBarDoubleClicked.connect(self.tab_open)

self.tabs.currentChanged.connect(self.current_tab_changed)

# 允许关闭标签

self.tabs.setTabsClosable(True)

# 设置关闭按钮的槽

self.tabs.tabCloseRequested.connect(self.close_current_tab)

self.add_new_tab(QUrl('https://www.baidu.com/'), '百度一下,你就知道')

self.setCentralWidget(self.tabs)

new_tab_action = QAction(QIcon('icons/add_page.png'), 'New Page', self)

new_tab_action.triggered.connect(self.add_new_tab)

# 添加导航栏

navigation_bar = QToolBar('Navigation')

# 设定图标大小

navigation_bar.setIconSize(QSize(24, 24))

self.addToolBar(navigation_bar)

# 添加前进、后退、停止加载和刷新的按钮

back_button = QAction(QIcon('icons/back.png'), 'Back', self)

forward_button = QAction(QIcon('icons/forward.png'), 'Forward', self)

stop_button = QAction(QIcon('icons/stop.png'), 'Stop', self)

reload_button = QAction(QIcon('icons/renew.png'), 'Reload', self)

back_button.triggered.connect(self.tabs.currentWidget().back)

forward_button.triggered.connect(self.tabs.currentWidget().forward)

stop_button.triggered.connect(self.tabs.currentWidget().stop)

reload_button.triggered.connect(self.tabs.currentWidget().reload)

# 将按钮添加到导航栏上

navigation_bar.addAction(back_button)

navigation_bar.addAction(forward_button)

navigation_bar.addAction(stop_button)

navigation_bar.addAction(reload_button)

navigation_bar.addSeparator()

navigation_bar.addWidget(self.urlbar)

# 响应回车按钮,将浏览器当前访问的URL设置为用户输入的URL

def navigate_to_url(self):

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

if current_url.scheme() == '':

current_url.setScheme('http')

self.tabs.currentWidget().load(current_url)

# 将当前网页的链接更新到地址栏

def renew_urlbar(self, url, browser=None):

# 非当前窗口不更新URL

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

return

self.urlbar.setText(url.toString())

self.urlbar.setCursorPosition(0)

# 添加新的标签页

def add_new_tab(self, qurl=QUrl(''), label='Blank'):

# 设置浏览器

self.browser = WebView(self)

self.browser.load(qurl)

# 为标签添加索引方便管理

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

self.tabs.setCurrentIndex(i)

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

# 将标签标题改为网页相关的标题

self.browser.loadFinished.connect(

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

# 双击标签栏打开新页面

def tab_open(self, i):

if i == -1:

self.add_new_tab()

def current_tab_changed(self, i):

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

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

def close_current_tab(self, i):

# 若当前标签页只有一个则不关闭

if self.tabs.count() < 2:

return

self.tabs.removeTab(i)

if __name__ == '__main__':

my_application = QApplication(sys.argv) # 创建QApplication类的实例

main_demo = MainDemo()

main_demo.show()

my_application.exec_()

相关素材

使用方法

双击标签页栏新建标签页单击进行返回操作单击进行继续操作单击进行刷新操作单击进行停止/退出操作按住Ctrl并滑动鼠标滚轮即可放大缩小

完整项目

链接: https://pan.baidu.com/s/13s-MQKNPOurS1PBLMHZkoQ

提取码: 1q25

相关文章

方舟生存进化的存档方法 方舟生存进化怎么存档
mobile 365365051

方舟生存进化的存档方法 方舟生存进化怎么存档

📅 07-07 👁️ 8076
如何使用导航应用下载歌曲
bt365登录

如何使用导航应用下载歌曲

📅 08-07 👁️ 5022
《云顶之弈》s14更新时间介绍
bt365登录

《云顶之弈》s14更新时间介绍

📅 08-22 👁️ 9987