手机拍的照片,想要保存到电脑上,每次传文件都得找数据线或第三方工具?
你是否遇到过这些场景:
- 想把手机里的照片、视频传到电脑上,却发现数据线不在身边。
- 电脑上有个 PPT 要播放,但手头没有翻页笔,想用手机遥控。
- 需要把电脑上的文件快速发给手机,又不想登录微信或 QQ。
其实,只要手机和电脑在同一个 Wi-Fi 下,我们完全可以用 Python 写一个轻量级的局域网互传工具,不需要外网,不依赖任何第三方服务,手机扫个码就能用。
今天我就把我自己写的这个工具发出来,(源码见文末)完整拆解给你看,包括环境配置、核心代码、打包成 exe 的全过程。
一、工具介绍及下载
1、工具界面;电脑端界面和手机H5页面
如下图:
(左: 电脑界面 右:手机界面)
电脑端:工具为单文件工具,不用安装,随意复制到桌面或文件夹中均可。
手机端:扫码后手机端出现一个H5网页,手机不用安装,用完即走模式。
2、功能介绍:
电脑端界面:
- 更改默认保存目录:选择文件保存目录后,当前保存目录会发生变化。
- 浏览已传文件:直达自己上传的文件夹,文件,照片多的特别方便。
手机界面
拍照传:手机和和电脑互联后,拍照秒传到电脑(单张照片)
批量传图:可批量选取相册中的照片同时传到电脑。
批量传视频:从手机批量选取视频上传到电脑。
批量传文件:从手机传选择的文件到电脑。
刷新:电脑传文件到手机后刷新就可以看到文件列表
清除:清除文件列表
@PPT:控制PPT翻页的一个小工具(包含,首页,尾页,前一页,后一页)
注意:使用前确保手机和电脑处于一个局域网中(同一个WIFI中),PPT控制是简单控制。
扫码:可用浏览器,微信,支付宝等扫码,微信最多传9张,其它扫码不受限
说明:工具制作来源于看到吾爱论坛一个大神开发的同款工具,但是当时这个工具只有一个拍照上传功能,于是觉得我能用上,自己顺便写了一个工具,还增加了更多功能。
工具地址:https://pan.baidu.com/s/1wGNBCtEMITLhdTmKKTTNvQ?pwd=shuu 提取码: shuu
欢迎试用,发现BUG请反馈给我,我会修改。
最制作工具想自己实践一番的,可看下一步,
不感兴趣的请直接跳到最后 点个“赞”和“爱心”
二、如何制作这种小工具;
1、技术架构
手机 (H5 页面)<--扫码-->电脑 (Flask 服务)<-->电脑本地文件系统 ├── 文件上传/下载 API
├── 共享文件列表 API
├── PPT 控制 API (模拟键盘)
└── Tkinter GUI (二维码 + 目录管理)
后端:Flask(轻量级 Web 框架)
桌面界面:Tkinter(Python自带,无需额外安装)
手机前端:纯 HTML + CSS + JavaScript(适配移动端)
二维码生成:qrcode 库
PPT 控制:ctypes 调用 Windows keybd_event(无需管理员权限)
2、环境配置步骤
1)安装 Python
官网下载 Python 3.8+(python.org)。
安装时务必勾选 “Add Python to PATH”(将 Python 添加到环境变量)。
验证安装环境:
python --versionpip --version
2)创建项目文件夹
比如在驱动盘E: 新建一个文件夹 CS; E:\CS
3)安装依赖库
打开命令提示符(CMD)或终端,进入项目文件夹,
执行以下命令:
pip install flask pillow qrcode
三个依赖库是:
✅ Flask v2.3.3 (Web 框架)
✅ Pillow v10.1.0 (图像处理)
✅ qrcode v未知 (二维码生成)
注:通过win+R键 打开运行框输入CMD进入DOS命令行
4)验证安装(显示OK则成功)
python -c "import flask, PIL, qrcode; print('OK')"
5)新建一个utf-8文件
新建一个txt文件,把核心代码复制到txt文件中,点击菜单-另存为,在最下面的编码框选择UTF-8,文件名改为:test.py 如下图:
test.py 放在E:\CS 文件夹下面
也可采用 Notepad++,VS Code (Visual Studio Code),Sublime Text等工具创建。
看不到扩展名的,提前按下图打开文件扩展名
6)核心代码(部分代码)
import osimport socketimport subprocessimport threadingimport tkinter as tkfrom tkinter import filedialog, messagebox, Menufrom flask import Flask, request, jsonify, send_file, Responsefrom PIL import Image, ImageTkimport qrcodeimport ctypesfrom ctypes import wintypesimport time# ================= Flask 后端服务 =================app = Flask(__name__)CONFIG = { "save_dir": os.path.abspath(os.path.join(os.path.expanduser("~"), "Desktop", "PhoneTransfer")), "files_to_phone": [], "port": 5000}os.makedirs(CONFIG["save_dir"], exist_ok=True)print(f"[启动] 当前保存目录: {CONFIG['save_dir']}")@app.route('/')def index(): return Response(H5_HTML, mimetype='text/html')@app.route('/upload', methods=['POST'])def upload_file(): files = request.files.getlist('files') saved_files = [] for file in files: if file.filename: save_path = os.path.join(CONFIG["save_dir"], file.filename) base, ext = os.path.splitext(save_path) counter = 1 while os.path.exists(save_path): save_path = f"{base}_{counter}{ext}" counter += 1 file.save(save_path) saved_files.append(os.path.basename(save_path)) return jsonify({"status": "success", "files": saved_files})@app.route('/list', methods=['GET'])def list_files(): return jsonify({"files": CONFIG["files_to_phone"]})@app.route('/clear', methods=['POST'])def clear_list(): CONFIG["files_to_phone"] = [] return jsonify({"status": "success"})@app.route('/download/<filename>', methods=['GET'])def download_file(filename): for file_path in CONFIG["files_to_phone"]: if os.path.basename(file_path) == filename: return send_file(file_path, as_attachment=True) return "File not found", 404# ================= PPT 控制路由(无第三方库,无需管理员权限) =================VK_HOME = 0x24VK_END = 0x23VK_PRIOR = 0x21 # Page UpVK_NEXT = 0x22 # Page Downdef press_key(hex_key_code): """模拟按键按下和释放""" ctypes.windll.user32.keybd_event(hex_key_code, 0, 0, 0) # 按下 time.sleep(0.05) ctypes.windll.user32.keybd_event(hex_key_code, 0, 0x0002, 0) # 释放@app.route('/ppt/<action>', methods=['GET'])def ppt_control(action): actions = { 'home': VK_HOME, 'end': VK_END, 'prev': VK_PRIOR, 'next': VK_NEXT } if action not in actions: return jsonify({"status": "error", "msg": "无效指令"}), 400 try: press_key(actions[action]) return jsonify({"status": "success", "action": action}) except Exception as e: return jsonify({"status": "error", "msg": str(e)}), 500
完整代码下载址:
https://pan.baidu.com/s/1VuaalvLR9fGxoM5C3LjwPA?pwd=mg86 提取码: mg86
7)在DOS窗口运行
E:\CS>python test.py 测试弹出的程序效果
8)打包工具
在DOS窗口运行: pip install pyinstaller
在你的 E:\CS>目录下,
执行:E:\CS>pyinstaller -F test.py
执行打包后,E:\CS目录下会生成这些文件
E:\CS\├── test.py ← 你的源代码├── test.spec ← 打包配置文件(可删除)├── build\ ← 临时构建文件(可删除)│ └── test\│ └── ...└── dist\ ← ★ 最终成果在这里! └── test.exe ← ★ 这就是打包好的可执行文件!
到这里就结束了,学废了吗?
这个工具虽然只有几百行代码,但涵盖了 Web 服务、桌面 GUI、移动端适配、系统 API 调用等多个方面,非常适合作为 Python 练手项目。
你可以在此基础上扩展:
增加文件断点续传功能。
支持多用户同时连接。
增加传输进度显示。
适配 macOS / Linux 平台。
全部源码
我已将完整代码整理好,你可以直接下载使用
如果你觉得这篇文章对你有帮助,
欢迎点赞、收藏、转发,让更多朋友告别数据线!
#python #python练手 #手机电脑互传 #拍照传电脑 #PPT遥控