对生成的pyqt5文件再次清洗

前言

这里的pyqt5文件,意思是指一个ui文件转换而成的py文件。

用Qt Designer设计窗口,生成ui文件,如果要把ui文件转换成py文件

要么通过python的命令,要么通过PyUic,但无论如何,其实我对转换出来的py文件,并不是很

满意,看着很不爽。

希望

用的pycharm的专业版,按ctrl+r,就会出现替换功能(好像社区版没有,我忘记了),

如图

每次写窗体。生成的py文件,都是通过这个替换功能进行清洗,该修改的修改,改删除的删除。

很明显,替换功能的实现,就是通过re,正则表达式,

我希望写个类,一运行,生成我所希望的pyqt5文件,就不需要慢慢替换了。

正文

(因为情况特殊)

没有在代码里面写注释,代码里面没有注释,没有注释的

代码里面类似注释的东西--要匹配的字符串,也不能修改,多个或者少个空格都会导致,清洗失败

import datetime
import re
class Clear_py:
    def __init__(self,title,class_name):
        self.title=title
        self.class_name=class_name
    def start(self,path,rename):
        with open(path) as f:
            data=f.read()
        na=path.split('.')[0]
        top=f"""
# Form implementation generated from reading ui file '{na}.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
"""
        a=re.sub(top,'',data)
        widget="""QtWidgets\."""
        b=re.sub(widget,'',a)
        widget="""QtCore\."""
        b=re.sub(widget,'',b)
        widget="""QtGui\."""
        b=re.sub(widget,'',b)
        kuohao="""QRect\("""
        c=re.sub(kuohao,'',b)
        name="""(.*?).setObjectName\(.*?\)"""
        d=re.sub(name,'',c)
        e=re.findall('def setupUi\(self, (.*)\):',d)[0]
        if e=='Dialog':
            f=re.sub(e,'self',d)
        elif e=='Form':
            f=re.sub(e,'self',d)
        trans="""_translate\(\"self\"\, """
        g=re.sub(trans,'',f)
        other="""
        self\.retranslateUi\(self\)
        QMetaObject\.connectSlotsByName\(self\)

    def retranslateUi\(self\, self\)\:
        _translate \= QCoreApplication\.translate
"""
        h=re.sub(other,'',g)
        poc="""
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_self\(object\)\:
    def setupUi\(self, self\)\:
"""
        place=f"""
\"\"\"
文件:{rename}
创建者:QE
时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
诗: 鲸鱼安慰了大海
            -燕七
    不是所有的树
    都能在自己的家乡终老
    不是所有的轨道
    都通往春暖花开的方向
    不是所有约定的人
    都会到来
    我知道,是流星赞美了黑夜
    鲸鱼安慰了大海
\"\"\"
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class {self.class_name}(QWidget):
    def __init__(self):
        super().__init__()
        self.initui()
    def initui(self):
        """
        i=re.sub(poc,place,h)
        right="""\)\)"""
        j=re.sub(right,')',i)
        start=f"""
if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle(QStyleFactory.create('Fusion'))
    a = {self.class_name}()
    a.show()
    sys.exit(app.exec_())
        """
        end=j+start
        window="""        self.setWindowTitle\(\"self\"\)"""
        title=f"""        self.setWindowTitle("{self.title}")"""
        end=re.sub(window,title,end)
        with open(rename,'w') as f:
            f.write(end)

参数的说明

”“”
   init方法
title,是指的窗体的名字
class_name 类的名字
   start 方法
path ui生成的py文件
rename  重用名的py文件(1.py)
中间有许多abcd等,都是变量名,按照字符顺序取的(0.0)(0.0)
再次说明-----正文里面没有注释
“”“

操作

随便拉些控件

对生成的pyqt5文件再次清洗_第1张图片

生成ui,去个名,叫ok.ui,通过PyUic转换成生成ok.py

ok.py复制过来,根本不想看,用上面的类再次清洗

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

# Form implementation generated from reading ui file 'ok.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(702, 577)
        self.lineEdit = QtWidgets.QLineEdit(Form)
        self.lineEdit.setGeometry(QtCore.QRect(120, 320, 113, 21))
        self.lineEdit.setObjectName("lineEdit")
        self.spinBox = QtWidgets.QSpinBox(Form)
        self.spinBox.setGeometry(QtCore.QRect(200, 30, 46, 22))
        self.spinBox.setObjectName("spinBox")
        self.treeView = QtWidgets.QTreeView(Form)
        self.treeView.setGeometry(QtCore.QRect(40, 70, 256, 192))
        self.treeView.setObjectName("treeView")
        self.toolButton = QtWidgets.QToolButton(Form)
        self.toolButton.setGeometry(QtCore.QRect(310, 90, 47, 21))
        self.toolButton.setObjectName("toolButton")
        self.horizontalScrollBar = QtWidgets.QScrollBar(Form)
        self.horizontalScrollBar.setGeometry(QtCore.QRect(510, 40, 160, 16))
        self.horizontalScrollBar.setOrientation(QtCore.Qt.Horizontal)
        self.horizontalScrollBar.setObjectName("horizontalScrollBar")
        self.line = QtWidgets.QFrame(Form)
        self.line.setGeometry(QtCore.QRect(230, 380, 118, 3))
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.line_2 = QtWidgets.QFrame(Form)
        self.line_2.setGeometry(QtCore.QRect(120, 460, 3, 61))
        self.line_2.setFrameShape(QtWidgets.QFrame.VLine)
        self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line_2.setObjectName("line_2")
        self.graphicsView = QtWidgets.QGraphicsView(Form)
        self.graphicsView.setGeometry(QtCore.QRect(400, 80, 256, 192))
        self.graphicsView.setObjectName("graphicsView")
        self.treeView_2 = QtWidgets.QTreeView(Form)
        self.treeView_2.setGeometry(QtCore.QRect(20, 350, 256, 192))
        self.treeView_2.setObjectName("treeView_2")
        self.comboBox = QtWidgets.QComboBox(Form)
        self.comboBox.setGeometry(QtCore.QRect(380, 40, 87, 22))
        self.comboBox.setObjectName("comboBox")
        self.spinBox_2 = QtWidgets.QSpinBox(Form)
        self.spinBox_2.setGeometry(QtCore.QRect(40, 310, 46, 22))
        self.spinBox_2.setObjectName("spinBox_2")
        self.calendarWidget = QtWidgets.QCalendarWidget(Form)
        self.calendarWidget.setGeometry(QtCore.QRect(330, 290, 296, 236))
        self.calendarWidget.setObjectName("calendarWidget")

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

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.toolButton.setText(_translate("Form", "..."))

运行代码

Clear_py('窗体','a').start('ok.py','1.py')
# 窗口的名字叫窗体,类名叫,a
# ok文件。重命名为1.py

运行后的1.py

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


"""
文件:1.py
创建者:QE
时间:2023-01-30 23:24:38
诗: 鲸鱼安慰了大海
            -燕七
    不是所有的树
    都能在自己的家乡终老
    不是所有的轨道
    都通往春暖花开的方向
    不是所有约定的人
    都会到来
    我知道,是流星赞美了黑夜
    鲸鱼安慰了大海
"""
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class a(QWidget):
    def __init__(self):
        super().__init__()
        self.initui()
    def initui(self):
        
        self.resize(702, 577)
        self.lineEdit = QLineEdit(self)
        self.lineEdit.setGeometry(120, 320, 113, 21)

        self.spinBox = QSpinBox(self)
        self.spinBox.setGeometry(200, 30, 46, 22)

        self.treeView = QTreeView(self)
        self.treeView.setGeometry(40, 70, 256, 192)

        self.toolButton = QToolButton(self)
        self.toolButton.setGeometry(310, 90, 47, 21)

        self.horizontalScrollBar = QScrollBar(self)
        self.horizontalScrollBar.setGeometry(510, 40, 160, 16)
        self.horizontalScrollBar.setOrientation(Qt.Horizontal)

        self.line = QFrame(self)
        self.line.setGeometry(230, 380, 118, 3)
        self.line.setFrameShape(QFrame.HLine)
        self.line.setFrameShadow(QFrame.Sunken)

        self.line_2 = QFrame(self)
        self.line_2.setGeometry(120, 460, 3, 61)
        self.line_2.setFrameShape(QFrame.VLine)
        self.line_2.setFrameShadow(QFrame.Sunken)

        self.graphicsView = QGraphicsView(self)
        self.graphicsView.setGeometry(400, 80, 256, 192)

        self.treeView_2 = QTreeView(self)
        self.treeView_2.setGeometry(20, 350, 256, 192)

        self.comboBox = QComboBox(self)
        self.comboBox.setGeometry(380, 40, 87, 22)

        self.spinBox_2 = QSpinBox(self)
        self.spinBox_2.setGeometry(40, 310, 46, 22)

        self.calendarWidget = QCalendarWidget(self)
        self.calendarWidget.setGeometry(330, 290, 296, 236)

        self.setWindowTitle("窗体")
        self.toolButton.setText("...")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle(QStyleFactory.create('Fusion'))
    a = a()
    a.show()
    sys.exit(app.exec_())

你直接复制,如果你有pyqt5,且版本没有太大变化,绝对可以运行。没有问题。

如图

对生成的pyqt5文件再次清洗_第2张图片

总结

你可以根据自己的情况进行修改正文的类,生成你所希望的文件。

当然,数据还可以在修改,继续用re,慢慢来

你可能感兴趣的:(pycharm,python,qt5)