返回顶部
首页 > 资讯 > 后端开发 > Python >用python制作个论文下载器(图形化界面)
  • 365
分享到

用python制作个论文下载器(图形化界面)

2024-04-02 19:04:59 365人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录一、使用说明二、代码分析1. 功能函数2. 回调函数3. 线程生成函数4. 效果展示写在最后在科研学习的过程中,我们难免需要查询相关的文献资料,而想必很多小伙伴都知道SCI-HU

在科研学习的过程中,我们难免需要查询相关的文献资料,而想必很多小伙伴都知道SCI-HUB,此乃一大神器,它可以帮助我们搜索相关论文并下载其原文。可以说,SCI-HUB造福了众多科研人员,用起来也是“美滋滋”。

在上一篇文章中介绍了分析过程以及相应的函数代码。根据小伙伴们的反映发现了一些问题,毕竟命令框的形式用起来难免没那么“丝滑”。为了让大家更方便地使用,可以“纵享丝滑”,kimol君决定写一个图形界面(GUI):

PS.由于近期实属忙到晕厥,这是kimol君用疯狂压榨出来的时间写的,所以界面比较简陋,还望大家多多体谅哦~

一、使用说明

这个小玩意儿我们姑且称之为“SCI-Downloader”好了~
它支持单篇论文下载和批量论文下载:

  • 单篇下载:在论文标题栏输入论文的标题、DOI号或PMID号,然后选择论文存储的目录,点击开始即可!
  • 批量下载:在论文标题那里选择一个.txt文本,文本里面包含了每篇需要下载的论文,其格式如下:

然后,emmm…没有然后了~
就是这么简单快捷,还不快来试试看,等啥呢?

二、代码分析

本次图形界面的开发是基于PyQt5的,具体界面的布置这里就不过多的介绍了,主要是对其中的功能实现进行说明:

其实思路很简单,由于之前已经有了论文下载的相关函数,我们只需要定义一个Button,然后将其绑定到下载函数即可。
这有啥?完全没难度嘛。然而,你试过就会知道,界面卡顿了。这是因为下载函数所消耗的时间较长,如果让它直接在主线程里面执行的话,将会和维持界面的主程序冲突,从而出现卡顿。因此,我们将要用到QThread来执行功能函数,回调函数来进行界面更新,示意图如下:

当然,这个示意图并不是那么严谨,大家辩证地看看就好了。这么一来,每个功能即可分为三个部分:Qthread类的功能函数、回调函数、线程生成函数(该函数与Button直接绑定)。

1. 功能函数

继承Qthread类,并对其中的run函数进行重定义,这是实现具体功能的模块,并且把状态通过signal的方式传递给回调函数:


class runthread(QtCore.QThread):
 # 通过类成员对象定义信号对象
 _signal = QtCore.pyqtSignal(str)
 
 def __init__(self, titleText, saveText):
  super(runthread, self).__init__()
  self.titleText = titleText
  self.saveText = saveText
 
 def __del__(self):
  self.wait()
 
 def run(self):
  if self.titleText == '' or self.saveText == '': # 如果为空
   self._signal.emit('EMPTY')
   return
  headers = {'User-Agent':'Mozilla/5.0 (windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0',
     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/WEBp,*/*;q=0.8',
     'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
     'Accept-Encoding':'gzip, deflate, br',
     'Connection':'keep-alive',
     'Upgrade-Insecure-Requests':'1'}
  if not self.titleText.endswith('.txt'): # 如果不为目录(即单篇论文标题)
   self._signal.emit('SEARCH')
   downUrl = search_article(self.titleText)
   if downUrl == '': # 如果搜索结果为空
    self._signal.emit('NULL')
    return
   else:
    try:
     self._signal.emit('DOWNLOAD')
     res = requests.get(downUrl, headers=headers, stream=True)
     fileSize = int(res.headers['Content-Length'])
     print(fileSize)
     savedSize = 0
     saveName = change_title(self.titleText)
     with open('%s/%s.pdf'%(self.saveText,saveName), 'wb') as f:
      for chunk in res.iter_content(chunk_size=1024):
       if chunk:
        f.write(chunk)
        savedSize += len(chunk)
        progress = int(savedSize/fileSize*100)
        self._signal.emit('PRO-%d'%progress)
     self._signal.emit('SUCCESS')   
    except:
     self._signal.emit('FAILED')
  else:
   paperList = read_file(self.titleText)
   if paperList == '':
    self._signal.emit('FILEWRONG')
   else:
    error = [] # 用于记录失败的论文
    self._signal.emit('BATCH-%d'%len(paperList))
    for i in range(len(paperList)):
     try:
      downUrl = search_article(paperList[i])
      print(downUrl)
      pdf = download_article(downUrl)
      saveName = change_title(paperList[i])
      with open('%s/%s.pdf'%(self.saveText,saveName), 'wb') as f:
       f.write(pdf)
     except:
      error.append(paperList[i])
     self._signal.emit('NUM-%d'%(i+1)) 
    with open('./errors.txt', 'w') as f:
     for e in error:
      f.write(e+'\n')
    self._signal.emit('COMPLETED-%d'%len(error))

2. 回调函数

通过监听来自功能函数的信号,对界面进行相应的更新,例如错误提醒或者下载完毕提示等等:


def call_backrun(self, msg):
 if msg == 'EMPTY':
  QtWidgets.QMessageBox.warning(self.centralwidget, '警告', '标题或目录为空!')
 if msg == 'SEARCH':
  self.runButton.setVisible(False)
  self.quitButton.setVisible(False)
  self.searchLabel.setVisible(True)
 if msg == 'NULL':
  self.runButton.setVisible(True)
  self.quitButton.setVisible(True)
  self.searchLabel.setVisible(False)
  QtWidgets.QMessageBox.infORMation(self.centralwidget, '提示', '未搜到相应论文!')
 if msg == 'DOWNLOAD':
  self.searchLabel.setVisible(False)
  self.progressBar.setVisible(True)
  self.progressBar.setFormat('%%p')
  self.progressBar.setValue(0)
 if 'PRO' in msg:
  pro = int(msg.split('-')[-1])
  self.progressBar.setValue(pro)
 if msg == 'SUCCESS':
  self.progressBar.setVisible(False)
  self.runButton.setVisible(True)
  self.quitButton.setVisible(True)
  self.titleEdit.setText('')
  QtWidgets.QMessageBox.information(self.centralwidget, '提示', '论文下载完毕!')
 if msg == 'FAILED':
  self.progressBar.setVisible(False)
  self.runButton.setVisible(True)
  self.quitButton.setVisible(True)
  QtWidgets.QMessageBox.information(self.centralwidget, '提示', '论文下载失败!')
 if msg == 'FILEWRONG':
  QtWidgets.QMessageBox.information(self.centralwidget, '提示', '论文列表错误!')
 if 'BATCH' in msg:
  sumNumber = msg.split('-')[-1]
  self.runButton.setVisible(False)
  self.quitButton.setVisible(False)
  self.progressBar.setVisible(True)
  self.progressBar.setFormat('【%v/'+sumNumber+'】')
  self.progressBar.setMinimum(0)
  self.progressBar.setMaximum(int(sumNumber))
  self.progressBar.setValue(0)
 if 'NUM' in msg:
  num = int(msg.split('-')[-1])
  self.progressBar.setValue(num)
 if 'COMPLETED' in msg:
  errorNum = int(msg.split('-')[-1])
  self.progressBar.setVisible(False)
  self.runButton.setVisible(True)
  self.quitButton.setVisible(True)
  self.titleEdit.setText('')
  QtWidgets.QMessageBox.information(self.centralwidget, '提示', '论文下载完毕!\n(%d个失败)'%errorNum)

3. 线程生成函数

这个函数与相应的按钮(Button)绑定,当触发时即创建一个对应的功能函数线程:


def run(self):
 titleText = self.titleEdit.text()
 saveText = self.saveEdit.text()
 # 创建线程
 self.runthread = runthread(titleText, saveText)
 # 连接信号
 self.runthread._signal.connect(self.call_backrun) # 进程连接回传到GUI的事件
 # 开始线程
 self.runthread.start()

4. 效果展示

大功告成之后,点击开始按钮,一键入魂:

无数的论文正在快马加鞭地向我奔来~

写在最后

通过简单地测试,功能基本上没有太大的问题,就是界面可能相对比较简陋,后续如果有时间的话我也将持续更新,当然也欢迎各位大大提出宝贵的意见呀~

此外,为了让大家更方便地使用,我已经将代码打包exe可执行文件,双击即可开启新世界的大门,不爽吗?

下载地址:https://wws.lanzous.com/iQE7Akpafid

以上就是用python制作个论文下载器(图形化界面)的详细内容,更多关于Python 论文下载器的资料请关注编程网其它相关文章!

--结束END--

本文标题: 用python制作个论文下载器(图形化界面)

本文链接: https://lsjlt.com/news/122566.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 用python制作个论文下载器(图形化界面)
    目录一、使用说明二、代码分析1. 功能函数2. 回调函数3. 线程生成函数4. 效果展示写在最后在科研学习的过程中,我们难免需要查询相关的文献资料,而想必很多小伙伴都知道SCI-HU...
    99+
    2024-04-02
  • Python+Tkinter制作专属图形化界面
    目录介绍tkinter的简单应用显示窗口设置窗口大小调整窗口位置(使用的是同一个方法)设置窗口的标题添加标签控件,并定位添加输入框,并定位调整控件的摆放位置添加点击按钮点击按钮自定义...
    99+
    2024-04-02
  • Python PyQt5-图形界面的美化操作
    前言 今天就来学习一下图形设计界面的美化,首先我们知道 QtDesigner设计出来的界面默认是不太怎么美观的。所以在以后的实际开发中很多界面都是要美化的。那么现在来看看具体怎么美化...
    99+
    2024-04-02
  • python图形化界面-我的第一个pyt
    python自带了tkinter模块,提供了快速创建GUI程序的方法。               import tkinter #导入tkinter模块 root=tkinter.Tk() root...
    99+
    2023-01-31
    第一个 图形化 界面
  • 如何在CentOS下安装和卸载图形化界面
    本篇内容主要讲解“如何在CentOS下安装和卸载图形化界面”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何在CentOS下安装和卸载图形化界面”吧!虽然说text模式下系统占用资源小,但是有时...
    99+
    2023-06-10
  • 关于Python制作简单的图形界面GUI
    #简单的图形界面GUI(Graphical User Interface) from tkinter import * import tkinter.messagebox as messagebox class Application(F...
    99+
    2023-01-31
    图形界面 简单 Python
  • python基于tkinter制作图形界面的2048游戏
    目录2048游戏输出项目先决条件 创建main.py 解释:1.Board:2.game:总结 2048游戏输出 项目先决条件 前提条件如下: 1. Python 2. Tkin...
    99+
    2024-04-02
  • 怎么在Python中使用tkinter图形化界面
    本篇文章为大家展示了怎么在Python中使用tkinter图形化界面,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python...
    99+
    2023-06-14
  • Linux图形化界面下怎么使用命令进行截图
    本篇内容介绍了“Linux图形化界面下怎么使用命令进行截图”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!以前在LINUX里面截图都是直接按p...
    99+
    2023-06-12
  • 利用Python制作百度图片下载器
    前段时间写了一个百度图片下载器,结果发现有很多人需要使用。说实话之前写的那一款百度图片下载器比较LOW,今天刚好有时间就做了一下升级。 更新了两个BUG,一个是图片下载达到几千张的时...
    99+
    2024-04-02
  • Python实现图形用户界面计算器
    本文实例为大家分享了Python实现图形用户界面计算器的具体代码,供大家参考,具体内容如下 简易用户图形界面计算器设计思路: 简易图形用户界面计算器的界面和功能设计如下: (1)第...
    99+
    2024-04-02
  • 利用Python+Excel制作一个视频下载器
    说起Excel,那绝对是数据处理领域王者般的存在。 而作为网红语言Python,在数据领域也是被广泛使用。 其中Python的第三方库-xlwings,一个Python和Excel的...
    99+
    2024-04-02
  • 如何用Python写一个带图形界面的文件压缩软件
    这期内容当中小编将会给大家带来有关如何用Python写一个带图形界面的文件压缩软件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。文件压缩和解压我们在日常工作学习中会经常用到,比如winrar、快压、好压等...
    99+
    2023-06-02
  • GUI 与图形用户界面的未来:智能和个性化
    人工智能 (AI) 和机器学习 (ML) 人工智能和机器学习技术的进步正在彻底改变 GUI 的未来。通过使用 AI 和 ML,GUI 能够学习用户的行为模式,提供个性化的体验。例如,一个 AI 驱动的 GUI 可以根据用户的喜好和交互历...
    99+
    2024-03-09
    GUI、图形用户界面、人工智能、机器学习、增强现实
  • 利用Python制作一个MOOC公开课下载器
    目录导语开发工具环境搭建先睹为快原理简介导语 记得很久以前写过一些中国大学MOOC上的视频下载器,不过好像都已经年久失修了。正好最近有需要,所以重新写了一个,顺便上来分享一波,寒假大...
    99+
    2024-04-02
  • 实现Python图形界面框架TkInter写GUI界面应用简介过程操作
    前言 它的底层是Tcl/Tk,先用起来再说,另外Python毕竟是面向对象语言,所以全文会使用到class和对象,尽量日后能满足开发项目的需求。 (备注:Tcl/Tk 是一种简明,高...
    99+
    2024-04-02
  • 怎么在Python中使用PyQt5对图形界面进行美化
    今天就跟大家聊聊有关怎么在Python中使用PyQt5对图形界面进行美化,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1 软件背景的添加最简单的方法就是直接在设计界面时,在style...
    99+
    2023-06-08
  • 如何用Python制作一个MOOC公开课下载器
    这篇文章主要介绍“如何用Python制作一个MOOC公开课下载器”,在日常操作中,相信很多人在如何用Python制作一个MOOC公开课下载器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用Python制作...
    99+
    2023-06-29
  • python制作可视化GUI界面自动分类管理文件
    目录不同的文件后缀归类为不同的类别output效果图经常杂乱无章的文件夹会让我们找不到所想要的文件,因此我特意制作了一个​​可视化GUI界面​​,通过输入路径一键点击实现文件分门别类...
    99+
    2024-04-02
  • Ubuntu系统图形化界面操作时的常用快捷键总结
    本篇内容主要讲解“Ubuntu系统图形化界面操作时的常用快捷键总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Ubuntu系统图形化界面操作时的常用快捷键总结”吧!键盘类1.先同时按住 Alt...
    99+
    2023-06-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作