(Translated by https://www.hiragana.jp/)
GitHub - zwbao/scihub_gui
Skip to content

zwbao/scihub_gui

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

よう PyQt5 うつしいち个 scihub 载器

PyQt いち个创けん GUI 应用ほどじょてき工具こうぐつつめ Python Qt てき合体がったい以用 Python 编写またが平台ひらだい包括ほうかつ UNIX,Windows Mac)てき GUI 应用ほどじょ。结合带的 Qt Designer 视化工具こうぐ进行界面かいめん设计,わが们可以非常ひじょう快速かいそく开发いち款功のう强大きょうだい界面かいめん观的 GUI 应用ほどじょ

ざい这个れい子中こなかわが们将从零开始ようよう PyQt5 うつしいち个界めんてき scihub 载器,さきらい预览いち下成しもなりひん(监听黏贴ばん --> 识别 DOI --> しも载文あきら --> すえ文章ぶんしょう题目じゅう命名めいめい --> 弹出消息しょうそくかまち):

完成かんせいてき包含ほうがん以下いかよん部分ぶぶんざい本文ほんぶんちゅうわが们将かい绍前两个部分ぶぶんそく设计 UI:

  1. もちい Qt Designer 设计界面かいめん生成せいせい .ui 格式かくしきてき界面かいめん
  2. よう pyuic5 はた .ui 转为 .py
  3. 构建ぬしほどじょ
  4. つつみ .py 为可执行文こうぶんけん

1. 环境じゅん

あんそう PyQt5

pip3 install PyQt5

あんそう PyQt5-tools

pip3 install pyqt5-tools

あんそう pyuic5-tool

pip3 install pyuic5-tool

2. 设计 UI

开 Qt Designer (ざい Anaconda てき bin 录下),Qt Designer いち非常ひじょう强大きょうだいてき GUI 设计工具こうぐゆうりょう它我们就以在ほどじょ设计ちゅうさらかい开发设计ほどじょ界面かいめん,避免りょうよう纯代码来うつし一个窗口的繁琐,どう时 PyQt 也支持しじ界面かいめんあずか逻辑ぶん离。Qt Designer 生成せいせいてきぶんけん格式かくしき为:.ui

开 Qt Designer 见到如下界面かいめん主要しゅようぶん为四个区域くいき项目ひかえけん编辑属性ぞくせい

Qt Designer 使用しようおこりらい非常ひじょう简单,编辑显示りょう软件てき主要しゅよう界面かいめんわが们只需将しょ需的ひかえけんひかえけん拖入编辑そく添加てんかひかえけん接着せっちゃくわが们可以在属性ぞくせい调整这些ひかえけんてき属性ぞくせい项目则用于显しめせひかえけん间的层级关系。

くびさきわが需要じゅよう新建しんたけまどこうてん击右上角うえすみてき新建しんたけ图标:

选择 QVGA 纵向:

现在编辑そく创建りょう一个空白的窗口:

ざい本文ほんぶんてきれい子中こなかわが们需よう添加てんかさん个控けん

  • QLabel:标签,该标签可以放纯文ほん,链接あるものとみぶんほんしんいき

  • QTextEdit行文こうぶんほんかまち以显しめせ行文こうぶんほん内容ないようとうぶん本内もとうちひろしちょうひかえけん显示范围时,显示滚动じょうQtextedit 仅可以用らい显示ぶんほん还可以用らい显示 HTML ぶん档。

  • QPushButton命令めいれい按钮,按下(あるもの单击)按钮以命令めいれい脚本きゃくほん执行ぼう操作そうさ

はた这三个控件分别从ひかえけんぶん别拖いれ编辑きさきざい项目みぎ键 MainWindow,选择ぬのきょく,选择垂直すいちょくぬのきょく,这样そく使わが们调せいまどこうてき大小だいしょう,这三个控件的相对位置保持不变。

添加てんかりょう所有しょゆうひかえけんきさきした一步便是分别设置控件的属性,进いち调整ひかえけんざい这个れい子中こなかわが们的にん务是更改こうかい QLabel QPushButton てきだま认文ほん并加字体じたいどう时还需将 QLabel 居中きょちゅう

そう击 TextLabel 编辑 QLabel てきぶんほん请输にゅう DOI接着せっちゃくざい属性ぞくせいかまち,font 选择からだ

alignment 水平すいへい选择居中きょちゅう

どう样,そう击 PushButton 编辑按钮ぶんほんDownload

いたり此我们已完成かんせいりょう所有しょゆう界面かいめん设计:

てん击右上角うえすみてき保存ほぞん图标另存为:

使用しよう UI Designer 设计こうまどたい保存ほぞん为文けん scihub_ui.ui きさきようざい Python さと使用しよう这个まどたい需要じゅようしょう .ui 转换为 python 格式かくしき,这里はたじょ pyuic5 工具こうぐざい命令めいれいぎょうちゅう输入:

pyuic5 -o scihub_ui.py scihub_ui.ui

转换成功せいこうきさきscihub_ui.py ぶんけんわが们可以简单看一下这个脚本里的内容,だい码里くびさき import りょう PyQt5 そう关库,并定义了めいUi_MainWindow てき class,这个 class 主要しゅよう包含ほうがん两个函数かんすう setupUi() retranslateUi()setupUi() よう于窗たいてきはつはじめはつはじめりょうかく个控けんなりself.xx,这与わが们在 Qt Designer さと添加てんかてきひかえけんいちいち对应てきretranslateUi() 设置りょうまどたいてき标题、标签てき文字もじ、按钮てき标题。

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'scihub_ui.ui'
#
# Created by: PyQt5 UI code generator 5.12.3
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(240, 320)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(10, 10, 211, 251))
        self.widget.setObjectName("widget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label = QtWidgets.QLabel(self.widget)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        self.textEdit = QtWidgets.QTextEdit(self.widget)
        self.textEdit.setObjectName("textEdit")
        self.verticalLayout.addWidget(self.textEdit)
        self.pushButton = QtWidgets.QPushButton(self.widget)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 240, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "请输にゅう DOI"))
        self.pushButton.setText(_translate("MainWindow", "Download"))

ざいした一部分中我们将介绍如何使用这种界面与逻辑分离的 GUI ほどじょかまち,并构けんぬし函数かんすう

3. 构建ぬしほどじょ

3.1 界面かいめんあずか逻辑ぶん离的 GUI ほどじょかまち

这里わが们采よう单继承てき界面かいめんふうそう方法ほうほう,编写ぬしほどじょ scihub_gui.py かまちだい码如

## 单继承方法ほうほうのうさら好地こうち进行界面かいめんあずか逻辑てきぶん离
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.Qt import QStandardPaths
from scihub_ui import Ui_MainWindow

class CustomUI(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent) # 调用ちち类构づくり函数かんすう,self 就是いち个 QMainWindow 对象
        self.ui = Ui_MainWindow() # 创建UI 对象
        self.ui.setupUi(self) # 构造UI

if __name__ == '__main__':
    app = QApplication(sys.argv) # 创建app,よう QApplication 类
    cutomUI = CustomUI()
    cutomUI.show()
    sys.exit(app.exec_())

3.2 实现文献ぶんけん载功のう

本来ほんらい自己じこうつしりょう个简单的脚本きゃくほんただしぜん两天ざい GitHub じょういたりょうこうのうさらかんぜんてき脚本きゃくほん所以ゆえん这里さまたげ做个调包侠。脚本きゃくほんhttps://github.com/zaytoun/scihub.py

这个脚本きゃくほん实现すえ DOI | PMID | URL しも文献ぶんけん PDF,使用しよう方法ほうほう非常ひじょう简单:

from scihub import SciHub

sh = SciHub()
result = sh.download('http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=1648853', path='paper.pdf')

わが们将该 Scihub.py 脚本きゃくほん载下らいざい scihub_gui.py てきどう一目いちもく录下,方便ほうべん调用。

しも文献ぶんけんきさき可用かよう PyPDF2 つつみひっさげ PDF しんいき,以根すえ文献ぶんけん标题じゅう命名めいめい PDF ぶんけん

from PyPDF2 import PdfFileReader

with open('paper.pdf', 'rb') as f:
    pdf = PdfFileReader(f)
    info = pdf.getDocumentInfo()
    title = info.title

3.3 PyQt5 てき事件じけん处理つくえせい

PyQt5 ゆう一个独一无二的信号和槽机制来处理事件。信号しんごうそうよう于对ぞう间的通信つうしんとう指定してい事件じけん发生,一个事件信号会被发射。ふね以被にんなん Python 脚本きゃくほん调用。とうそう连接てき信号しんごう发射时,ふねかい调用。

ざい Qt ちゅうまいいち个 QObject 对象 PyQt ちゅう所有しょゆう继承 QWidget てきひかえけん(这些 QObject てき对象)支持しじ信号しんごうあずかふねつくえせいとう信号しんごう发射时,连接てきふね函数かんすうしょうかい动执ぎょうざい PyQt 5 ちゅう信号しんごうあずかふねどおりひかえ件名けんめい.信号しんごう.connect(ふね函数かんすう) 方法ほうほう连接。

ざいわが们这个小ほどじょ中共ちゅうきょう包含ほうがんりょう两类信号しんごう

  1. 识别黏贴いたてき变化
  2. 识别按钮动作

所以ゆえんいちわが们为 scihub_gui.py 脚本きゃくほんじょう亿点てん细节,よう QApplication.clipboard() 读取黏贴ばんしんいき并重ていこう输出りゅう展示てんじざいぶんほん区域くいきない),绑定按钮事件じけん(获取さんすう&さわ发请もとめ),さいきさきよう QMessageBox 弹出しんいきかまちさいscihub_gui.py まとだい码如

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
from PyQt5.Qt import QStandardPaths
from scihub_ui import Ui_MainWindow
from scihub import SciHub
from PyPDF2 import PdfFileReader
import os

class CustomUI(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.cb = QApplication.clipboard()
        self.cb.dataChanged.connect(self.monitor_clipboard)
        self.ui.textEdit.setText(self.cb.text())
        self.ui.pushButton.clicked.connect(self.buttClicked)

    def monitor_clipboard(self):
        if self.cb.text():
            self.ui.textEdit.setText(self.cb.text())

    def buttClicked(self):
        try:
            curPath = QStandardPaths.writableLocation(QStandardPaths.DocumentsLocation) # だま认保存在そんざい ~/Documents
            pdf_name = "/paper.pdf" # だま认文件名けんめい为 paper.pdf
            test = SciHub()
            textEditber = self.ui.textEdit.toPlainText()
            test.download(textEditber, path= curPath + pdf_name)
            with open(curPath + pdf_name, 'rb') as f:
                pdf = PdfFileReader(f)
                info = pdf.getDocumentInfo()
                title = info.title

                if title != None and title != "":
                    file_name = title.replace(' ',"_")
                    file_name = file_name + ".pdf"
                    os.rename(curPath + pdf_name, curPath + "/" + file_name)
                else:
                    file_name = "paper.pdf"
        except:
            QMessageBox.information(self, '', 'しも载失败')

        else:
            QMessageBox.information(self, '', file_name + 'しも完成かんせい')
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    cutomUI = CustomUI()
    cutomUI.show()
    sys.exit(app.exec_())

对于いち些功のう较复杂的ほどじょわが们可以把这些进行逻辑操作そうさてき函数かんすういたいち个新てき .py ぶんけんちゅう,这样以方便びんきさき维护だい码。ただしざい这里いん为程じょ较简单,しょ以就直接ちょくせつざいおもほどじょちゅうりょう

踩过てきあなざい Qt ちゅうとうわが需要じゅよう调用 QFileDialog 保存ほぞんぶんけん时,得用とくよう QStandardPaths 指定していみちいや则打つつみ出来できてき软件ぼつほう保存ほぞん

完成かんせい上面うわつらてき骤,直接ちょくせつ行程こうていじょ就可以看いた界面かいめん啦,复制 DOI ある PMID,てんDownload そくした文献ぶんけんりょう~

4. つつみほどじょ为 Mac App

这里わが们用 pyinstaller 来生きすぎしげる行程こうていじょあんそう pyinstaller

pip install pyinstaller

じゅん备一个软件图标 icon:

可用かよう网站转换 png いたり ico 格式かくしきhttps://www.easyicon.net/covert/

つつみ

pyinstaller --windowed --onefile --clean --noconfirm scihub_gui.py -p scihub.py -i scihub.icns

ざい dist 录下そくいたつつみこのみてきほどじょ

よう你也そうりょう Anaconda,你会发现这么简单てきしょうほどじょたい居然きょぜんゆう 100M+,这是いん为 Anaconda さとないおけりょう很多库,つつみてき时候つつみりょう很多必要ひつようてき块进去。所有しょゆう为了缩小 App てきからだ积,わが们最こうざい一个新的虚拟环境中进行打包。

创建环境:

conda create -n scihubgui python=3.7

げきかつ环境:

conda activate scihubgui

あんそう赖:

pip install -r requirements.txt
  • requirements.txt
altgraph==0.17
beautifulsoup4==4.9.3
certifi==2020.6.20
chardet==3.0.4
idna==2.10
macholib==1.14
powerline-status==2.7
pyinstaller==4.0
pyinstaller-hooks-contrib==2020.9
PyPDF2==1.26.0
PyQt5==5.15.1
PyQt5-sip==12.8.1
PySocks==1.7.1
requests==2.24.0
retrying==1.3.3
six==1.15.0
soupsieve==2.0.1
urllib3==1.25.11

つつみほどじょ

pyinstaller --windowed --onefile --clean --noconfirm scihub_gui.py -p scihub.py -i scihub.icns

现在以看いたほどじょてき大小だいしょう缩小りょう一半いっぱん以上いじょうただしかん觉还ふとだいりょう需要じゅようさい研究けんきゅう)。

わがやめはた所有しょゆうだい码上传至 GitHub:https://github.com/zwbao/scihub_gui

教程きょうてい推荐

  1. Qt Documentation: https://doc.qt.io/
  2. Qt for Python: https://doc.qt.io/qtforpython/#project
  3. PyQt5 ちゅう文教ぶんきょうほどhttps://github.com/maicss/PyQt5-Chinese-tutorial
  4. 《Python Qt GUIあずかかずすえ视化编程》

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages