/SimPyWeb-X

基于Python和PyQt5实现的多标签网页浏览器

Primary LanguagePythonMIT LicenseMIT

SimPyWeb X —— 使用PyQt5以及QWebEngineView构建网页浏览器

更新说明

2020.1.26 SimPyWeb X 3.0 诈尸更新,多处修改

运行方式

  • shell 脚本直接运行
python __init__.py
  • 打包运行(可选择PyInstaller打包)

https://blog.csdn.net/creeperone/article/details/80957954

效果图

功能设计

主窗体绘制

  • 程序的init函数为启动函数,通过设定窗体的大小,标题,图标等等可以实现窗体的绘制。
def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    # 窗体
    self.setWindowTitle(self.name + self.version)
    self.setWindowIcon(QIcon('Assets/main.png'))
    self.resize(1200, 800)
    # 浏览器窗体
    self.browser = QWebEngineView()
    self.browser.load(QUrl("http://www.hao123.com/"))
    self.setCentralWidget(self.browser)

工具条实现

  • 工具条实现
# 工具条
navigation_bar = QToolBar('Navigation')
navigation_bar.setIconSize(QSize(32, 32))
self.addToolBar(navigation_bar)
  • 工具条按钮以及地址栏
# 后退按钮
back_button = QAction(QIcon('Assets/back.png'), '后退', self)
# 其他组件
self.url_text_bar = QLineEdit()
  • 将组件添加到工具条
navigation_bar.addAction(home_button)
navigation_bar.addSeparator()
navigation_bar.addWidget(self.url_text_bar)
  • 工具条按钮触发事件
# 事件触发
back_button.triggered.connect(self.browser.back)
  • 获取网页标题
def renew_title(self, s):
    self.setWindowTitle(self.name + self.version + " -- " + s)
  • 获取网页图标
def renew_icon(self, ico):
    self.setWindowIcon(ico)
  • 导向地址栏地址
def navigate_to_url(self):
    s = QUrl(self.url_text_bar.text())
    if s.scheme() == '':
        s.setScheme('http')
    self.browser.load(s)
  • 地址栏重新操作
def renew_urlbar(self, s):
    self.url_text_bar.setText(s.toString())
    self.url_text_bar.setCursorPosition(0)
  • 进度条设置
    def renew_progress_bar(self, p):
        self.progress_bar.setValue(p)

多标签页功能的实现

  • 添加标签
    def add_new_tab(self, tab):
        i = self.tabs.addTab(tab, "")
        self.tabs.setCurrentIndex(i)
        tab.back_button.triggered.connect(tab.browser.back)
        tab.next_button.triggered.connect(tab.browser.forward)
        tab.stop_button.triggered.connect(tab.browser.stop)
        tab.refresh_button.triggered.connect(tab.browser.reload)
        tab.home_button.triggered.connect(tab.navigate_to_home)
        tab.enter_button.triggered.connect(tab.navigate_to_url)
        tab.add_button.triggered.connect(self.add_blank_tab)
        tab.set_button.triggered.connect(tab.create_about_window)
        tab.url_text_bar.returnPressed.connect(tab.navigate_to_url)
        tab.browser.urlChanged.connect(tab.renew_urlbar)
        tab.browser.loadProgress.connect(tab.renew_progress_bar)
        tab.browser.titleChanged.connect(lambda title: (self.tabs.setTabText(i, title),
                                                        self.tabs.setTabToolTip(i, title)))
        tab.browser.iconChanged.connect(lambda icon: self.tabs.setTabIcon(i, icon))
  • 删除标签
    def close_current_tab(self, i):
        if self.tabs.count() > 1:
            self.tabs.removeTab(i)
        else:
            self.close()