社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python实用工具,Python和PyQt5开发框架,实现简易浏览器

戴沐白 • 5 年前 • 657 次点击  
阅读 28

Python实用工具,Python和PyQt5开发框架,实现简易浏览器

开发工具

Python版本:3.5.4 相关模块: PyQt5模块(5.10版本)以及一些Python自带的模块。

image.png

主要思路

主要实现的功能:

(1)可以正常显示网页;

(2)设置导航栏,用以实现浏览器的前进、后退、停止加载和刷新功能;

(3)设置地址栏,可以实时更新当前网页的URL,同时支持输入地址回车访问功能;

(4)设置标签页,可通过双击导航栏打开新的标签页,从而支持同时访问多个页面。 底层传输协议等功能的实现方式:借助PyQt5的QtWebEngine模块。

依赖项安装

安装PyQt5

Qt是一个跨平台的C++应用程序开发框架

1|sudo apt-get install python3-pyqt5
复制代码

安装完成后进入python命令行界面测试是否安装正确

1|python3  
2|>>>import PyQt5
复制代码

执行命令后如果没有任何提示,说明安装成功

编程实现

Qt为开发者提供了QtWebKit模块,QtWebKit是一个基于开源项目 WebKit的网页内容渲染引擎,借助该引擎可以更加快捷地将万维 网集成到 Qt 应用中。

更多参考:doc.qt.io/archives/qt…

##浏览器有一个可以用于展示网页的窗口

###创建浏览器

Qt的程序通过创建QApplication类实例来调用exec_()方法进入事件循环, 然后程序一直循环监听各种事件并把它们放入消息队列中,在适当的时候从队 列中取出处理。

1| #通过创建QApplication类实例来创建应用
2|app = QApplication(sys.argv)
3|#运行应用并循环监听事件
4|app.exec_()  
复制代码

我们可以使用Qt提供的QToolBar创建工具栏

1|...
2|# 添加导航栏
3|navigation_bar = QToolBar('Navigation')
4|# 设定图标的大小
5|navigation_bar.setIconSize(QSize(16, 16))
6|#添加导航栏到窗口中
7|self.addToolBar(navigation_bar)
8|...

复制代码

QAction类提供了抽象的用户界面action

1|#添加按钮
2|reload_button = QAction(QIcon('icons/renew.png'), 'reload', self)
复制代码

将action与实际功能绑定

1|reload_button.triggered.connect(self.browser.reload)
复制代码

这些action可以被放置在窗口部件中

1|navigation_bar.addAction(reload_button)
复制代码

Qt中有一个强大的部件类QWidgets,基于这个类可以派生出很多其他的小部件 ,比如QLineEdit是单行文本框,将这个不见作为地址栏,为浏览起添加一个地址栏

1|#添加URL地址栏
2|self.urlbar = QLineEdit()
复制代码

Qt中每种组件都有信号机制,可用来将信号与相应的处理函数进行连接绑定,比如将 地址栏的回车信号urlbar.returnPressed与navigate_to_url函数绑定,当地址栏的回车信号发出时 便会触发函数navigate_to_url进行处理

1|# 让地址栏能响应回车按键信号
2|self.urlbar.returnPressed.connect(self.navigate_to_url)
3|#navigate_to_url函数
4|def navigate_to_url(self):
5|   q = QUrl(self.urlbar.text())
6|    if q.scheme() == '':
7|        q.setScheme('http')
8|    self.browser.setUrl(q)
复制代码

代码




    
# v1.2
# created
#   by Roger
# in 2017.1.3

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWebKitWidgets import *

import sys

class MainWindow(QMainWindow):
    # noinspection PyUnresolvedReferences
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 设置窗口标题
        self.setWindowTitle('My Browser')
        # 设置窗口图标
        self.setWindowIcon(QIcon('icons/penguin.png'))
        # 设置窗口大小900*600
        self.resize(900, 600)
        self.show()

        # 设置浏览器
        self.browser = QWebView()
        url = 'http://blog.csdn.net/roger_lzh'
        # 指定打开界面的 URL
        self.browser.setUrl(QUrl(url))
        # 添加浏览器到窗口中
        self.setCentralWidget(self.browser)


        ###使用QToolBar创建导航栏,并使用QAction创建按钮
        # 添加导航栏
        navigation_bar = QToolBar('Navigation')
        # 设定图标的大小
        navigation_bar.setIconSize(QSize(16, 16))
        #添加导航栏到窗口中
        self.addToolBar(navigation_bar)

        #QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中
        # 添加前进、后退、停止加载和刷新的按钮
        back_button = QAction(QIcon('icons/back.png'), 'Back', self)
        next_button = QAction(QIcon('icons/next.png'), 'Forward', self)
        stop_button = QAction(QIcon('icons/cross.png'), 'stop', self)
        reload_button = QAction(QIcon('icons/renew.png'), 'reload', self)

        back_button.triggered.connect(self.browser.back)
        next_button.triggered.connect(self.browser.forward)
        stop_button.triggered.connect(self.browser.stop)
        reload_button.triggered.connect(self.browser.reload)

        # 将按钮添加到导航栏上
        navigation_bar.addAction(back_button)
        navigation_bar.addAction(next_button)
        navigation_bar.addAction(stop_button)
        navigation_bar.addAction(reload_button)

        #添加URL地址栏
        self.urlbar = QLineEdit()
        # 让地址栏能响应回车按键信号
        self.urlbar.returnPressed.connect(self.navigate_to_url)

        navigation_bar.addSeparator()
        navigation_bar.addWidget(self.urlbar)

        #让浏览器相应url地址的变化
        self.browser.urlChanged.connect(self.renew_urlbar)

    def navigate_to_url(self):
        q = QUrl(self.urlbar.text())
        if q.scheme() == '':
            q.setScheme('http')
        self.browser.setUrl(q)

    def renew_urlbar(self, q):
        # 将当前网页的链接更新到地址栏
        self.urlbar.setText(q.toString())
        self.urlbar.setCursorPosition(0)


# 创建应用
app = QApplication(sys.argv)
# 创建主窗口
window = MainWindow()
# 显示窗口
window.show()
# 运行应用,并监听事件
app.exec_()    
复制代码

文章到这里就结束了,感谢你的观看,关注我每天分享Python小工具系列,下篇文章分享SSH登录工具

为了感谢读者们,我想把我最近收藏的一些编程干货分享给大家,回馈每一个读者,希望能帮到你们。

干货主要有:

① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

⑥ 两天的Python爬虫训练营直播权限

All done~完整源代码+干货加Python新手学习交流社区:594356095

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/116445