zoukankan      html  css  js  c++  java
  • 【Python】Python PYQT4 GUI编程与exe打包

      本篇文章承接http://www.cnblogs.com/zhang-zhi/p/7646923.html#3807385,上篇文章描述了对文本文件的简单处理,本章节结合PYQT4实现该功能的GUI图形界面化,简单的UI界面可以更好的提高工具的实用性,所以在此进行一下记录。

    主要实现功能效果展示如下:
    1、打开本地对话框,选择文件
     
    2、文件打开,报文输入及报文清空功能
    3、核心功能,报文格式转换
    4、退出
    一、Python GUI开发之PYQT4
    1、先安装PYQT4
        有两种方式可以下载:
    ①pip下载,终端运行pip install pyqt4
    ②pycharm工具安装
    打开pycharm工具,点击“File”→“settings”→“Project:Project Interpreter”→“+(install)”→“输入pyqt4”,安装即可。
    2、在pyqt4的安装目录:C:UserszgAppDataLocalProgramsPythonPython36Libsite-packagesPyQt4下,找到应用程序启动即可。
    3、启动designer.exe程序后,进入Qt设计师主界面,就可以开始你的GUI设计之路了。。

    4、选择“Main window”窗体,创建~

    5、接下来是重点,pyqt4提供了直接将ui文件转为py文件的功能,非常实用,具体方法为:
    编辑好ui界面后,点击保存(最好保存在C:UserszgAppDataLocalProgramsPythonPython36Scripts目录下),终端执行命令:pyuic4 xxx.ui -o xxx.py即可生成py代码文件xxx.py。
    6、根据生成的py代码文件,再进行进一步的功能实现,下面贴出我的GUI界面及代码,仅供参考学习~
    一个简单的文本处理工具,实现接口报文的转换与生成

     

    代码如下:

      1 # -*- coding: utf-8 -*-
      2 
      3 # Form implementation generated from reading ui file 'DataRaw.ui'
      4 #
      5 # Created by: PyQt4 UI code generator 4.11.4
      6 #
      7 # WARNING! All changes made in this file will be lost!
      8 import sys
      9 import re
     10 from PyQt4 import QtCore, QtGui
     11 try:
     12     _fromUtf8 = QtCore.QString.fromUtf8
     13 except AttributeError:
     14     def _fromUtf8(s):
     15         return s
     16 
     17 try:
     18     _encoding = QtGui.QApplication.UnicodeUTF8
     19     def _translate(context, text, disambig):
     20         return QtGui.QApplication.translate(context, text, disambig, _encoding)
     21 except AttributeError:
     22     def _translate(context, text, disambig):
     23         return QtGui.QApplication.translate(context, text, disambig)
     24 
     25 class Ui_MainWindow(QtGui.QMainWindow):
     26     def __init__(self):
     27         QtGui.QMainWindow.__init__(self)
     28         self.setupUi(self)
     29 
     30     def setupUi(self, MainWindow):
     31         MainWindow.setObjectName(_fromUtf8("MainWindow"))
     32         MainWindow.resize(850, 740)
     33         # MainWindow.setMaximumSize(850, 740)
     34         #禁止窗口最大化
     35         MainWindow.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint)
     36         #禁止拖拉窗口
     37         MainWindow.setFixedSize(MainWindow.width(), MainWindow.height());
     38         MainWindow.setMouseTracking(False)
     39         icon = QtGui.QIcon()
     40         icon.addPixmap(QtGui.QPixmap(_fromUtf8(r"C:UserszgDesktopicoFacebook.ico")), QtGui.QIcon.Normal,QtGui.QIcon.Off)
     41         MainWindow.setWindowIcon(icon)
     42         self.centralwidget = QtGui.QWidget(MainWindow)
     43         self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
     44         self.pushButton = QtGui.QPushButton(self.centralwidget)
     45         self.pushButton.setGeometry(QtCore.QRect(370, 60, 75, 23))
     46         self.pushButton.setObjectName(_fromUtf8("pushButton"))
     47         self.pushButton_2 = QtGui.QPushButton(self.centralwidget)
     48         self.pushButton_2.setGeometry(QtCore.QRect(370, 110, 75, 23))
     49         self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))
     50         self.groupBox = QtGui.QGroupBox(self.centralwidget)
     51         self.groupBox.setGeometry(QtCore.QRect(20, 30, 341, 641))
     52         self.groupBox.setObjectName(_fromUtf8("groupBox"))
     53         self.textEdit_2 = QtGui.QTextEdit(self.groupBox)
     54         self.textEdit_2.setGeometry(QtCore.QRect(20, 30, 301, 551))
     55         #设置报文框字体
     56         font = QtGui.QFont()
     57         font.setFamily(_fromUtf8("新宋体"))
     58         font.setPointSize(10)
     59         font.setBold(False)
     60         font.setWeight(50)
     61         self.textEdit_2.setFont(font)
     62         self.textEdit_2.setMidLineWidth(1)
     63         #设置报文框垂直滚动条
     64         self.textEdit_2.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
     65         #设置报文框水平滚动条
     66         self.textEdit_2.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
     67         self.textEdit_2.setTabChangesFocus(True)
     68         self.textEdit_2.setUndoRedoEnabled(False)
     69         #设置报文框取消自动换行
     70         self.textEdit_2.setLineWrapMode(QtGui.QTextEdit.NoWrap)
     71         self.textEdit_2.setOverwriteMode(False)
     72         self.textEdit_2.setCursorWidth(1)
     73         self.textEdit_2.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByKeyboard | QtCore.Qt.LinksAccessibleByMouse | QtCore.Qt.TextBrowserInteraction | QtCore.Qt.TextEditable | QtCore.Qt.TextEditorInteraction | QtCore.Qt.TextSelectableByKeyboard | QtCore.Qt.TextSelectableByMouse)
     74         self.textEdit_2.setMouseTracking(True)
     75         self.textEdit_2.setAutoFillBackground(False)
     76         self.textEdit_2.setObjectName(_fromUtf8("textEdit_2"))
     77 
     78         self.pushButton_3 = QtGui.QPushButton(self.groupBox)
     79         self.pushButton_3.setGeometry(QtCore.QRect(20, 590, 101, 41))
     80         self.pushButton_3.setObjectName(_fromUtf8("pushButton_3"))
     81         self.pushButton_4 = QtGui.QPushButton(self.groupBox)
     82         self.pushButton_4.setGeometry(QtCore.QRect(220, 590, 101, 41))
     83         self.pushButton_4.setObjectName(_fromUtf8("pushButton_4"))
     84         self.groupBox_2 = QtGui.QGroupBox(self.centralwidget)
     85         self.groupBox_2.setGeometry(QtCore.QRect(460, 30, 370, 641))
     86         self.groupBox_2.setObjectName(_fromUtf8("groupBox_2"))
     87         self.textEdit = QtGui.QTextEdit(self.groupBox_2)
     88         self.textEdit.setGeometry(QtCore.QRect(20, 30, 332, 591))
     89         #结果框字体设置
     90         font = QtGui.QFont()
     91         font.setFamily(_fromUtf8("新宋体"))
     92         font.setPointSize(10)
     93         font.setBold(False)
     94         font.setWeight(50)
     95         self.textEdit.setFont(font)
     96         self.textEdit.setMidLineWidth(1)
     97         #结果框垂直滚动条设置开关
     98         self.textEdit.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
     99         # 结果框水平滚动条设置开关
    100         self.textEdit.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
    101         self.textEdit.setTabChangesFocus(True)
    102         self.textEdit.setUndoRedoEnabled(False)
    103         #结果框取消自动换行
    104         self.textEdit.setLineWrapMode(QtGui.QTextEdit.NoWrap)
    105         self.textEdit.setOverwriteMode(False)
    106         self.textEdit.setCursorWidth(1)
    107         self.textEdit.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByKeyboard | QtCore.Qt.LinksAccessibleByMouse | QtCore.Qt.TextBrowserInteraction | QtCore.Qt.TextEditable | QtCore.Qt.TextEditorInteraction | QtCore.Qt.TextSelectableByKeyboard | QtCore.Qt.TextSelectableByMouse)
    108         self.textEdit.setMouseTracking(True)
    109         self.textEdit.setAutoFillBackground(False)
    110         self.textEdit.setObjectName(_fromUtf8("textEdit"))
    111 
    112         # self.customContextMenuRequested(QPoint)
    113         MainWindow.setCentralWidget(self.centralwidget)
    114         self.menubar = QtGui.QMenuBar(MainWindow)
    115         self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
    116         self.menubar.setObjectName(_fromUtf8("menubar"))
    117         self.menu = QtGui.QMenu(self.menubar)
    118         self.menu.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)
    119         self.menu.setObjectName(_fromUtf8("menu"))
    120         MainWindow.setMenuBar(self.menubar)
    121         self.statusbar = QtGui.QStatusBar(MainWindow)
    122         self.statusbar.setObjectName(_fromUtf8("statusbar"))
    123         MainWindow.setStatusBar(self.statusbar)
    124         self.action = QtGui.QAction(MainWindow)
    125         self.action.setCheckable(False)
    126         icon = QtGui.QIcon()
    127         icon.addPixmap(QtGui.QPixmap(_fromUtf8(r"C:UserszgDesktop---icoOpen.ico")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    128         self.action.setIcon(icon)
    129         self.action.setShortcutContext(QtCore.Qt.WidgetShortcut)
    130         self.action.setObjectName(_fromUtf8("action"))
    131         self.action_2 = QtGui.QAction(MainWindow)
    132         icon1 = QtGui.QIcon()
    133         icon1.addPixmap(QtGui.QPixmap(_fromUtf8(r"C:UserszgDesktop---icoLog Out.ico")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    134         self.action_2.setIcon(icon1)
    135         self.action_2.setObjectName(_fromUtf8("action_2"))
    136         self.menu.addAction(self.action)
    137         self.menu.addAction(self.action_2)
    138         self.menubar.addAction(self.menu.menuAction())
    139 
    140         self.retranslateUi(MainWindow)
    141         QtCore.QObject.connect(self.action_2, QtCore.SIGNAL(_fromUtf8("triggered()")), MainWindow.close)
    142         QtCore.QObject.connect(self.action, QtCore.SIGNAL(_fromUtf8("triggered()")), self.openfile)
    143         QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.soap)
    144         QtCore.QObject.connect(self.pushButton_2, QtCore.SIGNAL(_fromUtf8("clicked()")), self.http)
    145         QtCore.QObject.connect(self.pushButton_3, QtCore.SIGNAL(_fromUtf8("clicked()")), self.openfile)
    146         QtCore.QObject.connect(self.pushButton_4, QtCore.SIGNAL(_fromUtf8("clicked()")), self.textEdit_2.clear)
    147         QtCore.QMetaObject.connectSlotsByName(MainWindow)
    148 
    149     def soap(self):
    150         linenum = 1
    151         header = 'soap_request(
    	"StepName=google", 
    	"ExpectedResponse=AnySoap", 
    	"URL=http://api.google.com/search/beta2", 
    	"SOAPEnvelope= "
    	"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
    '
    152         last = '
    	'+'"Snapshot=t1.inf",
    	"ResponseParam=result",
    	LAST );'
    153         src = self.textEdit_2.toPlainText()
    154         lines = src.splitlines()
    155         Message = ''
    156         for line in lines:
    157             #判断该行是否为空行
    158             if len(line.strip())>0:
    159                 #找出每行第一个非空字符的位置
    160                 num = re.search(r'S', line).span()[0]
    161                 if linenum < len(lines):
    162                     #对每行进行拼接
    163                     line = "	"+line[:num] + '"' + line[num:].replace('"',r'"').rstrip() + '"' + '
    '
    164                     linenum += 1
    165                 else:
    166                     line = "	"+line[:num] + '"' + line[num:].replace('"',r'"').rstrip() + '"' + ','
    167             else:
    168                 line = '
    '
    169                 linenum += 1
    170             Message += line
    171         if len(lines)>0:
    172             try:
    173                 Trans_Message = header + Message + last
    174                 #输出到界面
    175                 self.textEdit.clear()
    176                 self.textEdit.append(Trans_Message)
    177             except:
    178                 print("输入错误")
    179         else:
    180             print("异常")
    181     # http报文转换
    182     def http(self):
    183         linenum = 1
    184         header = 'web_custom_request(
    	"name",
    	"Method=POST",
    	"URL=http://{SERVERIP}:7017/ciitcmp/commserver",
    	"Body="
    '
    185         last = '	LAST );'
    186         src = self.textEdit_2.toPlainText()
    187         lines = src.splitlines()
    188         Message = ''
    189         for line in lines:
    190             # 判断是否是空行
    191             if len(line.strip()) == 0 or line.startswith('#'):
    192                 continue
    193                 # data = '
    	
    '
    194                 linenum += 1
    195             elif len(line.strip()) > 0 and linenum < len(lines):
    196                 num = re.search(r'S', line).span()[0]
    197                 data = '	' + line[:num] + '"' + line[num:].replace('"', r'"').rstrip() + '"' + '
    '
    198                 linenum += 1
    199             else:
    200                 num = re.search(r'S', line).span()[0]
    201                 data = '	' + line[:num] + '"' + line[num:].replace('"', r'"').rstrip() + '"' + ',' + '
    '
    202             Message += data
    203         if len(lines)>0:
    204             try:
    205                 # #print(myMd5_Digest)
    206                 Trans_Message = header + Message + last
    207                 #输出到界面
    208                 self.textEdit.clear()
    209                 self.textEdit.append(Trans_Message)
    210             except:
    211                 pass
    212         else:
    213             pass
    214     #打开本地文件夹
    215     def openfile(self):
    216         try:
    217             filename = QtGui.QFileDialog.getOpenFileName(self,"Open file","/")
    218             with open(filename, 'r') as f:
    219                 FileData = f.read()
    220             self.textEdit_2.setPlainText(FileData)
    221         except:
    222             print("关闭文件对话框!")
    223     def retranslateUi(self, MainWindow):
    224         MainWindow.setWindowTitle(_translate("MainWindow", "文本处理工具V2.0 By:---", None))
    225         MainWindow.setStatusTip(_translate("MainWindow", "文本处理工具", None))
    226         self.pushButton.setStatusTip(_translate("MainWindow", "点击将报文转换为soap请求", None))
    227         self.pushButton.setText(_translate("MainWindow", "SOAP", None))
    228         self.pushButton_2.setStatusTip(_translate("MainWindow", "点击将报文转换为http请求", None))
    229         self.pushButton_2.setText(_translate("MainWindow", "HTTP", None))
    230         self.groupBox.setTitle(_translate("MainWindow", "报文", None))
    231         self.textEdit_2.setStatusTip(_translate("MainWindow", "文本输入框", None))
    232         self.pushButton_3.setStatusTip(_translate("MainWindow", "点击打开本地文件", None))
    233         self.pushButton_3.setText(_translate("MainWindow", "Open", None))
    234         self.pushButton_4.setStatusTip(_translate("MainWindow", "点击清除文本框内容", None))
    235         self.pushButton_4.setText(_translate("MainWindow", "Clear", None))
    236         self.groupBox_2.setTitle(_translate("MainWindow", "结果", None))
    237         self.textEdit.setStatusTip(_translate("MainWindow", "结果输出框", None))
    238         self.menu.setTitle(_translate("MainWindow", "文件", None))
    239         self.action.setText(_translate("MainWindow", "打开", None))
    240         self.action.setStatusTip(_translate("MainWindow", "点击打开本地文件", None))
    241         self.action.setShortcut(_translate("MainWindow", "Ctrl+D", None))
    242         self.action_2.setText(_translate("MainWindow", "退出", None))
    243         self.action_2.setStatusTip(_translate("MainWindow", "点击退出程序", None))
    244         self.action_2.setShortcut(_translate("MainWindow", "Ctrl+C", None))
    245 if __name__ =='__main__':
    246     app = QtGui.QApplication(sys.argv)
    247     Form = QtGui.QMainWindow()
    248     ui = Ui_MainWindow()
    249     ui.setupUi(Form)
    250     Form.show()
    251     sys.exit(app.exec_())
    二、将py文件打包成exe文件
        实现exe文件打包的工具很多,如:pyinstaller、py2exe、cxfreeze等,这里使用cxfreeze进行文件打包,直接使用pip install pyinstaller安装pyinstaller即可。
    此时可以为exe文件添加自己想要的ico图标,方法如下:
    注意:将ico文件放在py文件相同目录下,并修改xxx.spec文件(与xxx.py文件同一目录下,相同名字的spec文件)

    打开终端,执行pyinstaller xxx.spec

    生成exe文件~

    笔者用cxfreeze进行过exe文件的打包,过程中发生了一下,特此记录一下~
    ①、安装cxfreeze完毕后,到安装目录C:UserszgAppDataLocalProgramsPythonPython36Scriptspyinstaller下,运行命令行窗口,执行命令cxfreeze,若发生以下报错

    ②、需在该目录下,创建cxfreeze.bat文件,文件内容为

    3、执行如下命令打包即可
    cxfreeze xxx.py --target-dir=d:dist --icon=d:xxxx.ico
      以上就是就是Python PYQT4的简单应用了,实现的功能比较简单,后续会在进行相应的功能优化,敬请期待~~~
  • 相关阅读:
    在VS2010 C++中调试DLL工程的方法
    Dos命令关机、重启
    js中实现缓动效果
    win32程序窗口的创建
    win32子窗口和控件
    c++DLL添加导出函数
    Win32创建窗口的过程
    贝塞尔曲线的数学原理
    一些基本的GDI操作BITMAP的方法
    Windows快捷键
  • 原文地址:https://www.cnblogs.com/zhang-zhi/p/9157570.html
Copyright © 2011-2022 走看看