如何用python写工具软件?教程学了一堆,实战却无从下手?掌握这套项目拆解方法,独立开发并不难!
你是否Python语法熟练,但面对一个完整的桌面工具开发却不知从何开始?本文将从需求分析、库选型、代码结构、到打包成exe,手把手拆解一个真实项目(如:[举个具体例子,如‘自动整理文件工具’]),帮你打通‘知道’到‘做到’的最后一公里。
一、如何把python代码编译成exe
1、将你的python文件my.py放在python安装目录下(C:\Users\Administrator\AppData\Local\Programs\Python\Python312)。
在命令行中导航到你的 Python 脚本所在的目录:cd C:\Users\Administrator\AppData\Local\Programs\Python\Python312
(如果 不在C盘,则执行:cd /d 路径)
2、在命令行中执行以下命令:
pyinstaller --onefile --noconsole --icon=xx.ico my.py
--onefile:将所有依赖打包成一个单独的.exe文件。xx.ico是你的图标文件(必须是.ico格式)。- 如果你的程序是 GUI 程序(例如使用
tkinter),可以通过--noconsole参数隐藏控制台窗口 my.py:你的 Python 脚本文件名。- 打包完成后,生成的
.exe文件会位于dist文件夹中
补充说明:
你的python文件不放在python安装目录下也行,只需用 cd /d 路径 导航到你的python文件目录下,再执行pyinstaller --onefile --noconsole --icon=xx.ico my.py
就行
二、如何用Python 的标准 GUI 库Tkinter制作窗口按钮编辑框


三、模拟按键

四、模拟鼠标点击

五、后台模拟操作
使用 win32gui 和 win32api 进行后台操作是通过调用 Windows API 实现的。这些库允许你直接与 Windows 操作系统交互,例如查找窗口、发送消息、模拟键盘和鼠标输入等。以下是对 win32gui 和 win32api 的详细解说,包括安装、基本用法和示例代码。
win32gui 和 win32api 是 pywin32 库的一部分。首先需要安装 pywin32:
pip install pywin32
安装完成后,你可以通过以下方式导入模块:
import win32gui
import win32con
import win32api
3. 常用函数
查找窗口
FindWindow(className, windowName):根据类名或窗口标题查找窗口句柄。className:窗口类名(可以为None)。windowName:窗口标题(可以为None)。
发送消息
SendMessage(hwnd, msg, wParam, lParam):向指定窗口发送消息。hwnd:目标窗口句柄。msg:消息类型(如WM_KEYDOWN、WM_LBUTTONDOWN)。wParam和lParam:消息的附加参数。
获取窗口信息
GetWindowRect(hwnd):获取窗口的位置和大小。GetWindowText(hwnd):获取窗口的标题。GetClassName(hwnd):获取窗口的类名。
4. 根据鼠标所在位置获取窗口句柄
可以通过鼠标的当前位置获取窗口句柄(HWND)。使用 win32gui 库中的 WindowFromPoint 函数可以实现这一功能。
函数原型: HWND WindowFromPoint(POINT Point)
Point:一个包含x和y坐标的结构体。- 返回值:窗口句柄(HWND)。

WindowFromPoint 返回的是最顶层的窗口句柄。。如果需要进一步操作子窗口,可以结合 ChildWindowFromPoint 或 RealChildWindowFromPoint。这种方法非常适合需要与特定窗口或控件交互的自动化任务。
示例代码
示例 1:查找窗口并获取窗口信息

示例 2:后台发送按键

示例 3:后台发送鼠标点击

示例 4:后台输入文本

SendMessage(hwnd, msg, wParam, lParam)函数详细解
参数说明
1. hWnd
- 类型:
HWND - 说明:目标窗口的句柄(Handle to Window)。窗口句柄是 Windows 系统中唯一标识一个窗口的值。
2. Msg
- 类型:
UINT - 说明:要发送的消息类型。Windows 定义了许多标准消息,例如:
WM_KEYDOWN:按键按下。WM_KEYUP:按键释放。WM_LBUTTONDOWN:鼠标左键按下。WM_LBUTTONUP:鼠标左键释放。WM_CLOSE:关闭窗口。WM_SETTEXT:设置窗口或控件的文本。
3. wParam
- 类型:
WPARAM - 说明:消息的附加信息,具体含义取决于
Msg。 - 示例:
- 对于
WM_KEYDOWN消息,wParam是虚拟键码(如VK_RETURN表示回车键)。 - 对于
WM_SETTEXT消息,wParam通常为0。
- 对于
4. lParam
- 类型:
LPARAM - 说明:消息的附加信息,具体含义取决于
Msg。 - 示例:
- 对于
WM_KEYDOWN消息,lParam包含按键的重复计数、扫描码等信息。 - 对于
WM_LBUTTONDOWN消息,lParam包含鼠标点击的坐标(低 16 位为x坐标,高 16 位为y坐标)。
- 对于
返回值
- 类型:
LRESULT - 说明:返回值取决于发送的消息类型。通常用于获取操作的结果。
- 示例:
- 发送
WM_GETTEXT消息时,返回值是复制的字符数。
- 发送
在 Windows 编程中,wParam 的值通常与虚拟键码(Virtual Key Code)相关。虚拟键码是 Windows 定义的一组常量,用于表示键盘上的按键。通常以 VK_ 开头。以下是一些常见的虚拟键码:


- 需要注意的是,
win32con模块中定义了一些常见的虚拟键码常量,如: win32con.VK_RETURN:回车键。win32con.VK_SHIFT:Shift 键。win32con.VK_CONTROL:Ctrl 键。win32con.VK_MENU:Alt 键。
对于字母键、数字键等,win32con 没有直接定义常量,你需要使用值的方式来使用,比如
VK_A=0x41 #A键
VK_A=0x42 #B键
六、注册热键
keyboard 是一个简单易用的库,支持热键注册和全局键盘事件监听。
安装 keyboard
Pip install keyboard
说明
keyboard.add_hotkey(hotkey, callback):注册热键并绑定回调函数。hotkey:热键组合,例如'ctrl+shift+a'。callback:热键触发时调用的函数。
keyboard.wait(key):阻塞程序,直到按下指定键(如'esc')。

七、读写ini配置项
1.创建新的配置文件


2. 读取配置项

3.写入配置项

4、处理不同类型的值
configparser 默认将所有值读取为字符串。如果你需要其他类型的数据(如整数、布尔值),你需要手动转换:
server_alive_interval = int(config['DEFAULT']['ServerAliveInterval'])
compression = config['DEFAULT'].getboolean('Compression')
5、处理不存在的配置项
如果尝试访问不存在的配置项,configparser 会抛出 KeyError。为了避免这种情况,可以使用 get() 方法并提供默认值:
user_age = config['user'].get('Age', 'Unknown')
print(f"User Age: {user_age}")
八、创建线程、启动线程、结束线程

九、实践案例:开发批量修图工具





十、创建超级列表框


十一、打开文件(通用对话框)

十二、置剪辑板文本

另一种置剪辑板文本的方法(更好):
import pyperclip
pyperclip.copy(text) #将文本添加到剪辑板
十三、给超级列表框(tree)添加右键菜单


十四、实践案例:开发自动录入工具





十五、载入新窗口与时钟周期事件
原代码:

分析说明:
time.sleep(1)阻塞主线程:- 在
get_mouse_position函数中,time.sleep(1)会阻塞整个 GUI 主线程,导致界面卡住,无法响应其他操作(如关闭窗口或移动窗口)。 - 解决方法:使用
tkinter的after()方法代替time.sleep(),这样可以避免阻塞主线程。
- 在
- 全局变量的使用:
- 你在
open_new_window函数中使用了global关键字来定义new_window、label1和label2。虽然这样可以访问这些变量,但过度使用global可能会导致代码难以维护。 - 解决方法:可以将这些变量作为类的属性(如果使用面向对象编程),或者通过函数参数传递。
- 你在
pyautogui的实时性:- 你的代码在
get_mouse_position中使用for循环来获取鼠标坐标,但这种方式不够灵活。如果用户关闭了新窗口,循环仍然会继续运行。 - 解决方法:使用
after()方法实现定时任务,并在新窗口关闭时停止任务。
- 你的代码在
button2的布局问题:button2使用了pack(pady=50),但它的位置可能会与其他组件重叠。- 解决方法:使用
place()或grid()方法更精确地控制布局。
改进后的代码1:

改进的代码2(面向对象编程):


改进后的代码3(更合理):

改进后的代码4(更合理):

十六、类的简单用法

十七、构建简易数据库

十八、文字识别程序
Tesseract OCR
- 特点:开源的OCR引擎,支持多种语言,包括中文、英文等。可以集成到Python中,适合开发者使用。
- 适用场景:本地部署、开发集成。
- 优点:免费、开源、可定制性强。
- 缺点:对复杂排版或低质量图片的识别效果可能较差
步骤:
下载并安装 Tesseract
打开 Tesseract 的安装目录(例如 C:\Program Files\Tesseract-OCR)
检查 tessdata 文件夹中是否存在 chi_sim.traineddata 文件。如果不存在,可以手动下载:
- 下载
chi_sim.traineddata文件。(在百度网盘的 软件或安装包/ Tesseract OCR语言包及安装包 中有) - 将其放入
tessdata文件夹中
. 设置环境变量
- Windows:
- 右键点击“此电脑”或“我的电脑”,选择“属性”。
- 点击“高级系统设置” -> “环境变量”。
- 在“系统变量”中,找到或新建
TESSDATA_PREFIX,将其值设置为tessdata文件夹的路径(例如C:\Program Files\Tesseract-OCR\tessdata)。 - 点击“确定”保存。
- 在“系统变量”中,找到path变量,点击“编辑”,在弹出窗口中点击“新建”,把
C:\Program Files\Tesseract-OCR添加进去。 - 注意:设置环境变量以后,需要重启电脑才能生效?
如果你不想修改环境变量,可以在代码中直接指定 tessdata 路径:
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
pytesseract.pytesseract.TESSDATA_PREFIX = r'C:\Program Files\Tesseract-OCR\tessdata'
调用案例:

十九、实际项目:文字识别工具开发




二十、实际项目:注册机开发


二十一、实际项目: 文字识别工具开发(完善版)








以上OCR代码打包成exe:
pyinstaller --onefile --noconsole --icon=sync.ico --add-binary "C:\Program Files\Tesseract-OCR\tesseract.exe;." --add-data "C:\Program Files\Tesseract-OCR\tessdata;tessdata" 02文字识别-注册版-需本地安装Tesseract.py
说明:-add-binary "C:\Program Files\Tesseract-OCR\tesseract.exe;."
--add-data "C:\Program Files\Tesseract-OCR\tessdata;tessdata"
以上两条命令是把Tesseract打包到exe中
--onefile 打包成一个exe文件
--noconsole 不需要控制台
--icon=sync.ico 设置程序图标
以上实战案例在易语言中也可以轻松实现,以下是相关技术文章链接:
《告别重复劳动!易语言实现档案数字化录入全自动助手》
https://blog.csdn.net/u013741272/article/details/155843644?spm=1011.2415.3001.5331
告别手动修图!这个工具让批量处理扫描文档效率翻倍(去灰底、去黑边、文字加深、自动纠斜)_易语言实战项目
https://blog.csdn.net/u013741272/article/details/155669286?spm=1011.2415.3001.5331
更多推荐


所有评论(0)