美文网首页
python--pyside2--第一个图形程序

python--pyside2--第一个图形程序

作者: w_dll | 来源:发表于2021-01-09 22:56 被阅读0次

可以更好地下载网页上的内容了!


该程序第一版见此:
https://www.jianshu.com/p/5055edb0867b

写了5版, 很多问题的改进终于完成


后端源码

import sys, io, re, os, shutil, ast
from urllib import request
from PySide2.QtWidgets import QApplication, QMainWindow, QFileDialog
from PySide2 import QtGui, QtWidgets, QtCore
from demo import Ui_MainWindow
from PySide2.QtGui import  QIcon

class MainWindow(QMainWindow, Ui_MainWindow):
  def __init__(self, base_dir):
    super(MainWindow, self).__init__()
    self.base_dir = base_dir
    self.setupUi(self)
    self.select_floder.clicked.connect(self.open_floder)
    self.submit_ok.clicked.connect(self.download_readmine)


  def get_download_url(self, sub_url, redmine_type):
    url_key_pattern = re.compile(r"href=\".*\"")
    url_key = url_key_pattern.findall(str(sub_url))
    url_key_pattern = re.compile(r"\/redmine.*\"")
    url_key = url_key_pattern.findall(str(url_key))
    sub_url = str(url_key[0])
    sub_url = sub_url.split('"')
    sub_url = str(sub_url[0])
    if redmine_type == '01' :
      download_url = "http://redmine.springgroup.cn" + sub_url
    elif redmine_type == '02' :
      download_url = "http://redmine02.springgroup.cn" + sub_url
    return download_url


  def get_file_name(self, sub_url):
    url_key_pattern = re.compile(r"href=\".*")
    url_key = url_key_pattern.findall(str(sub_url))
    this_file_name = str(url_key[0])
    this_key_pattern = re.compile(r"\>.*?\<")
    this_file_name = this_key_pattern.findall(str(this_file_name))
    this_file_name = str(this_file_name[0])
    this_file_name = this_file_name.strip('>,<')
    return this_file_name


  def get_span_info(self, span_url):
    this_key_pattern = re.compile(r"\>.*?\<")  
    span_info = this_key_pattern.findall(str(span_url))
    span_info = str(span_info[0])
    span_info = span_info.strip('>,<')
    return span_info

  def get_cfg_value(self, cfg_name):
    file_name = 'settings.cfg'
    cfg_file = open(file_name, 'r', encoding="utf-8")
    this_cfg_value = 'null'
    for li in cfg_file:
      if li and '#' not in str(li):
        li = li.split(' = ')
        this_cfg_name = li[0].strip()
        cfg_value = li[-1].strip()
        if '_list' in this_cfg_name:
          cfg_value = ast.literal_eval(cfg_value)
        if this_cfg_name == cfg_name:
          #print(cfg_value)
          this_cfg_value = cfg_value
          break
    cfg_file.close()
    return this_cfg_value


  def pre_fun(self, save_dir, redmine_number):
    match_list = self.get_cfg_value('match_list')
    match_info_list = self.get_cfg_value('match_info_list')
    if  match_list == 'null':
      match_list = ["rar", "zip", "tgz", "tar", "配置", "更新操作手册.html", "war", "发布清单", "conf", "更新清单"]
    if match_info_list == 'null':
      match_info_list = ["rar", "zip", "tgz", "tar", "配置", "war", "发布清单", "conf", "更新清单"]
    self.textEdit_3.append(save_dir)
    self.textEdit_3.append(redmine_number)
    len_redmine_number = len(redmine_number)
    if len_redmine_number == 6:
      cookie_str = self.get_cfg_value('cookie_str_01')
      if cookie_str == 'null':
        cookie_str = r'_redmine_session=ajhuOC9xbG9NaWlyUjJ4RTBzcDF4cjl1SVVzUlF4V1dURitCQ2x1U0FpQ1kva1ZrM1ppZ3FDTjVXbnNkdlNHSld3WCt4UjVIYlFBcFhMd29mTVdTc290ZGk5WGRERzl0RmR6V3VubFMxQkF1VGQvQlVGcHdEZWhkMTJFMzNGbVdQSlhYcnJldG81aGxUMGMxK0k0TWxLV1FJdHNnakx5Zm8yNWFMdXk4NWpYZVpGQmVBeFc1eUVDQWJFUGlwNjV4SXB1S0IxKy9EYUVOczNJMUU4VnEyMzh3eDRLYW9JRWVKL2toZVNhTnkvN051RFVVVnExYlU2Zmk5U2xPUkFzc0tqdWl2eDFJMFBOeFJoUmE1dklGaVNsQm1NNi8xazRLcG1icHRFS01DUTR4MGt3dENnYWs4TFB6WENZemZZQW45MU1qNlBTWmcxTytXbHZhWkZPck9pdXZVMzZpWVl6VlBHUmtHMjVTQkNTWS9TRWtjbFhRdGJGaWVHazVseDFSMHJ5WGd3dDBTTGNNK3plV3VaZWI0NVcxVmZBeWR6N3ZkUnQ4UWN6ZStIRHdCUi9tVm5GR044dEMvQW14czR3TFpKMHZEWDFSYlhqbXN4dzlYZWY0S1ZxZVpBRE5Vc2ZaSmlzdFFkZ0xuQ0FhZi9DMExtTkR0T0dSY2VIRHl2L0hqcjVYME02S3E5blBHeGdYVkh2LzhyeW5iRmxiRHJJTW05UG56MTIzSGpZPS0tK2tCc0cway9MNHZTdzQ0Ynd5K21YQT09--0d7676e2c2d3bad6d03b6fce8bb19986b06a3be0'
      redmine_url = 'http://redmine.springgroup.cn/redmine/issues/' + redmine_number
      redmine_type = '01'
    elif len_redmine_number == 4:
      cookie_str = self.get_cfg_value('cookie_str_02')
      if cookie_str == 'null':
        cookie_str = r'_redmine_session=Yk9lZEcvUG5KYVNDMXAvMGs3MG5McExRbFBSdmc5ZUl0ZEVXKzJSUi93Y2lYSlV6bDhndGpVMlB3UGxHOWdlK3pqaFV3TTBjREFvOEVQWHUraklsbHU0TUcvdmRsVE9aUTZtSFdIVWV3c1diY0VucUZWQnhTNTdyZXI0TzM3WWtobWF2dnp0VUFUNWQ4bCtCQTN1VXFEMENlY1VmRWZuQk9na3l6TFRXcDd3eU9TY3psZVZsanIveGpaT3ZaeDlXS1R4eUFtRGtaWEltQmFqOTZLR1JhUjZhWUFNWXJvbkhTYlJnMmpTOGxUR0VXUGJTYWRGNjhDU0F5TGJDZjlMUUl5ZnNmRnNPcDg1OWF5d2h0QU8rVFVBdmd5SkphYjhDRGJYS3hDNGg3cGxLOGllSERXam5lWVZvVHBWMFdEUXlZbUx6d1pxRjN1SEttT0kwR0VqSXdVWlZYSGxNaUxneUFpNTNMOVRzVDlIeFY4cVhEUXVPZGhuNWRRY1BzakFiYzM1UVJFWnpLODQ1ZmsxYndnUmFkWW1CVDg0VHlRcDF4U3hOYm5lanUyV3J0elNuRTdHczh6VEZ2ZC9yM3VkYnBKc0czRXo2Vk9QUW9rRUhVWS9WcnVLdEFIeSs4dldOdzBYcE9HSDZqZjkvOVRpS2hQeHhvazBPVTdzYzFsaWVNcUVtR1J2eHpRa1BqNStPa3ZWcmZLUFZBT05seUxsR1hPV0RsMzRnb2FWSmwwbG1pT1hVOGNpRGVSWE8vQ01zbUNSamtOcjRZcmN5eHQvajUzYXpoelg1T2psd2RBd0VNalU2WlV5TWhScz0tLWRVc2swV1FpRGlEdGZ5SVZLeEtHemc9PQ%3D%3D--8c8f689ced7f53990688848cb0ea665f0d1a011b'
      redmine_url = 'http://redmine02.springgroup.cn/redmine/issues/' + redmine_number
      redmine_type = '02'
    else:
      self.textEdit_3.append("redmine号 可能有误")
    os.chdir(save_dir)
    dir_list = os.listdir('.')
    dir_name = 'redmine_' + redmine_number + '-'
    for li in dir_list:
      if dir_name in str(li) or li == str(redmine_number):
        shutil.rmtree(li)
    if not os.path.isdir(redmine_number):
      os.makedirs(redmine_number)
    os.chdir(redmine_number)
    return redmine_url, cookie_str, redmine_type, match_list, match_info_list


  def start_download(self, redmine_url, cookie_str, redmine_type, redmine_number, match_list, match_info_list):
    #sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码
    req = request.Request(redmine_url)
    req.add_header('cookie', cookie_str)
    req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36')
    resp = request.urlopen(req)
    this_titile_name = ''
    dir_name = ''
    txt_flag = 0
    this_txt = redmine_url + '\n' + 'redmine' + redmine_number + '_v' + '\n\n'
    while resp:
      li = resp.readline().decode('utf-8')
      if "</html>" in li:
        break
      if txt_flag == 0 and '<p><a class="icon icon-attachment" href="' in li \
      and ("数据库" not in li and "已添加" not in li):
        for i in match_info_list:
          if i in li:
            txt_flag = 1
            break
      elif '</p>' in li:
        txt_flag = 0
      if txt_flag == 1 and ('<span class="size">' in li or '<span class="author">' in li or 'icon icon-attachment' in li):
        if 'icon icon-attachment' in li:
          this_txt = this_txt + str(self.get_file_name(li)) + ' '
        elif '<span class="author">' in li:
          this_txt = this_txt + str(self.get_span_info(li)) + '\n'
        else:
          this_txt = this_txt + str(self.get_span_info(li)) + ' '
      if redmine_number in li and '</title' in li:
        dir_name = li.split(':')
        dir_name = dir_name[1]
        dir_name = dir_name.split('-')
        dir_name = dir_name[0].strip()
        this_titile_name = dir_name
        dir_name = 'redmine_' + redmine_number + '-' + str(dir_name)
      if ("数据库" not in li and "已添加" not in li)\
      and ("href" in li and "download" in li):
        for i in match_list:
          if i in li:
            file_name = self.get_file_name(li)
            download_url = self.get_download_url(li, redmine_type)
            #print("--- %s ---" % (file_name))
            self.textEdit_3.append("--- %s ---" % (file_name))
            req1 = request.Request(download_url)
            req1.add_header('cookie', cookie_str)
            req1.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36')
            this_file = request.urlopen(req1)
            data = this_file.read()
            with open(file_name.encode('utf-8'), "wb") as code:
              code.write(data)
            break
    file_name = '001_' + this_titile_name + '_info.txt'
    #f = open('001__info.txt', "w")
    f = open(file_name, 'w')
    f.write(this_txt)
    f.close()
    file_list = os.listdir()
    if not os.path.isdir('更新操作手册'):
      os.makedirs('更新操作手册')
    for li in file_list:
      if '更新操作手册.html' in li:
        shutil.move(li, '更新操作手册')
    os.chdir('..')
    os.rename(redmine_number, dir_name)

  def open_floder(self):
    this_dir = os.getcwd()
    open_floder_name = QFileDialog.getExistingDirectory(self, "选择下载保存的文件夹", this_dir)
    temp_dir = '__pycache__'
    if os.path.exists(temp_dir):
      shutil.rmtree(temp_dir)
    self.lineEdit_2.setText(str(open_floder_name))

  def download_readmine(self):
    try:
      BASE_DIR = self.base_dir
      #print(str(BASE_DIR))
      os.chdir(BASE_DIR)
      self.textEdit_3.setText("")
      save_dir = str(self.lineEdit_2.text())
      if not os.path.exists(save_dir):
        save_dir = os.getcwd()
      redmine_number = str(self.lineEdit.text())
      redmine_url, cookie_str, redmine_type, match_list, match_info_list = self.pre_fun(str(save_dir), str(redmine_number))
      self.start_download(redmine_url, cookie_str, redmine_type, redmine_number, match_list, match_info_list)
      self.textEdit_3.append("下载完成")
    except Exception as e:
      self.textEdit_3.append(str(e))


if __name__ == '__main__':
    base_dir = os.getcwd()
    app = QtWidgets.QApplication(sys.argv)
    app.setWindowIcon(QIcon('logo.ico'))
    window = MainWindow(base_dir)
    window.show()
    sys.exit(app.exec_())

前端源码

-- 注: qt生成

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

################################################################################
## Form generated from reading UI file 'demo.ui'
##
## Created by: Qt User Interface Compiler version 5.15.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################

from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(600, 430)
        MainWindow.setMinimumSize(QSize(600, 430))
        MainWindow.setMaximumSize(QSize(600, 430))
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.textEdit_3 = QTextEdit(self.centralwidget)
        self.textEdit_3.setObjectName(u"textEdit_3")
        self.textEdit_3.setGeometry(QRect(40, 100, 450, 250))
        self.textEdit_3.setMinimumSize(QSize(450, 250))
        self.textEdit_3.setMaximumSize(QSize(450, 250))
        self.submit_ok = QPushButton(self.centralwidget)
        self.submit_ok.setObjectName(u"submit_ok")
        self.submit_ok.setGeometry(QRect(500, 320, 71, 31))
        self.submit_ok.setMaximumSize(QSize(589, 500))
        self.widget = QWidget(self.centralwidget)
        self.widget.setObjectName(u"widget")
        self.widget.setGeometry(QRect(40, 30, 272, 55))
        self.verticalLayout = QVBoxLayout(self.widget)
        self.verticalLayout.setObjectName(u"verticalLayout")
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2 = QHBoxLayout()
        self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
        self.label = QLabel(self.widget)
        self.label.setObjectName(u"label")
        self.label.setMaximumSize(QSize(8777215, 8777215))

        self.horizontalLayout_2.addWidget(self.label)

        self.lineEdit = QLineEdit(self.widget)
        self.lineEdit.setObjectName(u"lineEdit")

        self.horizontalLayout_2.addWidget(self.lineEdit)


        self.verticalLayout.addLayout(self.horizontalLayout_2)

        self.horizontalLayout = QHBoxLayout()
        self.horizontalLayout.setObjectName(u"horizontalLayout")
        self.label_2 = QLabel(self.widget)
        self.label_2.setObjectName(u"label_2")

        self.horizontalLayout.addWidget(self.label_2)

        self.lineEdit_2 = QLineEdit(self.widget)
        self.lineEdit_2.setObjectName(u"lineEdit_2")

        self.horizontalLayout.addWidget(self.lineEdit_2)

        self.select_floder = QPushButton(self.widget)
        self.select_floder.setObjectName(u"select_floder")

        self.horizontalLayout.addWidget(self.select_floder)


        self.verticalLayout.addLayout(self.horizontalLayout)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 600, 23))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName(u"statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)

        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"redmine\u4e0b\u8f7d\u5668", None))
        self.submit_ok.setText(QCoreApplication.translate("MainWindow", u"ok", None))
        self.label.setText(QCoreApplication.translate("MainWindow", u"redmine\u53f7\u7801", None))
        self.label_2.setText(QCoreApplication.translate("MainWindow", u"\u6587\u4ef6\u8def\u5f84", None))
        self.select_floder.setText(QCoreApplication.translate("MainWindow", u"\u9009\u62e9\u6587\u4ef6\u5939", None))
    # retranslateUi

配置文件见此

打包命令

pyinstaller -F main_v5.pyw demo.py --hidden-import PySide2.QtXml --icon="logo.ico"

运行结果

相关文章

网友评论

      本文标题:python--pyside2--第一个图形程序

      本文链接:https://www.haomeiwen.com/subject/onvhaktx.html