IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 记Python开发小工具过程 -> 正文阅读

[Python知识库]记Python开发小工具过程

前言

因为压测一个系统,需要大量的id。网上找的工具一次最多生成500个,完全是杯水车薪了。就找了python生成的代码,修改成一次生成36万个,这次够用了。为了方便以后使用,就学习开发一个GUI界面,将之打包成exe小工具。这里记录一下整个学习流程。
选择使用wxPython配套的开发工具wxFormBuilder,它的图形可视化界面可以快速直观的帮助我搭建起GUI界面。

一、wxPython环境准备

1、wxPython可以从官方网站http://wxpython.org下载,或者使用pip下载wxPython依赖库。

pip installer wxPython

2、安装图形可视化生成工具
wxFormBuilder 是一款开源的跨平台WYSIWYG GUI构建器,可将wxWidget GUI设计转换为C ++,Python,PHP或XML格式。
github项目地址https://github.com/wxFormBuilder/wxFormBuilder,
这里下载最新版https://github.com/wxFormBuilder/wxFormBuilder/releases,安装到本地。默认安装。
在这里插入图片描述

二、wxFormBuild创建工具图形可视化界面

1、先选择项目保存代码为python,代码文件名称window。
在这里插入图片描述

2、选择Frame控件、Layout方式等,这里参考学习:https://blog.csdn.net/abc6368765/article/details/121796397
https://zhuanlan.zhihu.com/p/107451739?utm_source=wechat_session
建立以下界面,可以输入年份,选择地区,然后生成,下方可以选择文件夹保存生成的txt文件。
点击‘开始生成’按钮后,程序开始运行,建立txt文件,进度条实时更新。在这里插入图片描述
3、建立报错与成功提示弹窗Dialog,在选择错误地址与生成完成时,弹窗提示。
在这里插入图片描述
添加事件绑定,按钮与进度条方法
4、F8保存代码,或者复制python页面的代码使用。
在这里插入图片描述

三、界面方法调试

1、将上面生成的window.py文件放到项目下面,主文件内导入GUI界面
import window。因为上面自动生成的window.py内容会随着界面变化而变化,所以不要直接修改这个文件。
在这里插入图片描述
2、初始化窗口,完善进度条与生成按钮的方法。
将生成id代码,放在按钮函数下面。(太长就不粘了)

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import wx               #wxPython
import window


class ff1(window.MyDialog1):
    '''失败提示弹窗'''
    def __init__(self, parent):
        window.MyDialog1.__init__(self, parent)

class ff2(window.MyDialog11):
    '''成功提示弹窗'''
    def __init__(self, parent):
        window.MyDialog11.__init__(self, parent)


class MainWindow(window.sfz):
    '''主窗口程序'''

    def __init__(self, parent):
        window.sfz.__init__(self,parent)
        self.jindutiao=0                           #进度条值


    def m_gauge1OnChar(self, event):
        '''进度条'''
        self.m_gauge1.SetValue(self.jindutiao)      #更新进度条
        if self.jindutiao == 100 :
            self.m_button1.Enable()                 #启用按钮
            dialog=ff2(main_win)                    #成功弹窗
            dialog.ShowModal()


    def gennerator(self, event):
        '''
        生成按钮:获取年份、地区、保存地址等
        '''
        self.jindutiao=0                        #按下按钮,置为0。不报错后续置灰按钮
        year= str(self.year1.GetValue())        #年份   GetValue()返回当前文本框中的所有文案
        where=self.where1.GetStringSelection()  #地区   GetStringSelection() 返回当前文本框中选中的文本
        for key, value in bianma.AREA_INFO.items():
            if value == where:
                AREA2 = key                     #地区编码

        path=self.path.GetPath()                #保存路径判断
        if path == "不选地址,文件默认保存在桌面":
            path = os.path.join(os.path.expanduser("~"), 'Desktop') #获取桌面路径
        elif os.path.exists(path) == True:      #判断路径是否存在
            path = self.path.GetPath()
        else:
            dialog=ff1(main_win)                #错误提示框
            dialog.ShowModal()
            self.jindutiao=-1

        if self.jindutiao>=0:
            event.GetEventObject().Disable()    #禁用按钮

3、启动GUI界面

if __name__ == '__main__':
    app = wx.App()                  #每一个wxPython应用程序都是一个wx.App实例
    main_win = MainWindow(None)     #None表示这个frame是顶层的框架,没有父框架
    main_win.Show(True)             #show()方法激活窗体,True显示这个Frame(窗口);False,隐藏窗口;
    app.MainLoop()                  #运行程序

4、运行程序,点击生成按钮,程序在桌面成功建立了txt文件,本来以为可以完工了,但工具界面立马提示未响应,程序假死。。。
大家都在发

四、线程解决wxpython界面无响应假死问题

1、出问题了,百度说计算时间太长,ui界面反应不了,程序就无响应。这当然要解决,思路是调用线程计算耗时的代码,pubsub在线程与界面之间通讯。
参考:
https://www.bajins.com/Python/PythonGUI.html#多线程防假死动态刷新界面
https://blog.csdn.net/rockcandy123/article/details/121310660

2、主程序新增pub.subscribe(self.m_gauge1OnChar, “update”),订阅

class MainWindow(window.sfz):
    '''主窗口程序'''

    def __init__(self, parent):
        window.sfz.__init__(self,parent)
        pub.subscribe(self.m_gauge1OnChar, "update")#发布一个叫update的主题,触发m_gauge1OnChar函数
    def m_gauge1OnChar(self, event):
        '''进度条'''
        self.jindutiao = event
        self.m_gauge1.SetValue(self.jindutiao)      #更新进度条

3、生成程序放线程里面,用pub向GUI发消息。
经调试,假死问题解决。

class TestThread(threading.Thread):
    '''多线程防假死与线程间传递消息'''

    def __init__(self,year,where,path,AREA2):
        self.year=year
        self.where=where
        self.path=path
        self.AREA2=AREA2
        threading.Thread.__init__(self)         #线程实例化时立即启动
        self.start()
        self.jindutiao=0

    def run(self):
        """线程执行合成身份证代码"""
       '''计算耗时的代码略'''
            pub.sendMessage("update", event=self.jindutiao)     #发update消息,指定event参数的值

五、pyinstaller打包

1、首先安装pyinstaller 包

pip install pyinstaller

在代码文件夹内,打开cmd,使用命令打包成一个exe.

pyinstaller -F -w -i logo.ico sfz.py

生成exe文件在dist里面。但是又发现一个问题,生成的文件偏大,这不能忍。百度去。
在这里插入图片描述
2、网上说主要原因是pyinstaller会把python环境中的很多项目没有用到的包都一起打包进去,这样就增大了exe的大小。
解决方法是使用虚拟环境,如:pipenv库、anaconda创建的虚拟环境
参考:
https://blog.csdn.net/yueyi0221/article/details/121717471
https://zhuanlan.zhihu.com/p/348120084
3、两个环境都试了,都可以用,打包的程序差不多大小。最后工具9M多点点。

总结

制作小工具之路,一步一坑,但也学到了wxPython、pub等基础使用,以后再有类似开发相信会更得心应手。
人生苦短,我学python。
工具与代码放盘里了,链接:https://pan.baidu.com/s/18sJiBU6cmVOeitVNgjyT1Q
提取码:b2ie

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-07-03 10:44:49  更:2022-07-03 10:46:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 12:00:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码