当前位置: 首页 > news >正文

使用Python创建EXE运行器和截图工具

在今天的博客中,我们将探讨如何使用Python和wxPython创建一个强大而实用的桌面应用程序。这个应用程序可以遍历指定文件夹中的所有EXE文件,并提供运行这些文件和自动截图的功能。无论你是系统管理员、软件测试人员,还是仅仅对自动化工具感兴趣的开发者,这个项目都会给你带来启发。
C:\pythoncode\new\runfolderexeandsnapshot.py

功能概述

我们的应用程序具有以下主要功能:

  1. 选择文件夹并遍历其中的所有EXE文件(包括子文件夹)
  2. 在列表框中显示找到的EXE文件
  3. 双击列表项运行对应的EXE文件
  4. 一键运行所有找到的EXE文件
  5. 自动为每个运行的程序截图
  6. 将截图以原EXE文件名保存在指定位置

技术栈

为了实现这些功能,我们使用了以下Python库:

  • wxPython: 用于创建图形用户界面
  • os: 用于文件系统操作
  • subprocess: 用于运行外部程序
  • pyautogui: 用于屏幕截图
  • PIL (Python Imaging Library): 用于图像处理

全部代码

import wx
import os
import subprocess
import pyautogui
from PIL import Imageclass MainFrame(wx.Frame):def __init__(self):super().__init__(parent=None, title='EXE Runner and Screenshot Tool')panel = wx.Panel(self)self.list_box = wx.ListBox(panel, pos=(5, 35), size=(350, 300), style=wx.LB_SINGLE)self.list_box.Bind(wx.EVT_LISTBOX_DCLICK, self.on_dclick)select_btn = wx.Button(panel, label='选择文件夹', pos=(5, 5), size=(100, 25))select_btn.Bind(wx.EVT_BUTTON, self.on_select)run_all_btn = wx.Button(panel, label='运行全部', pos=(110, 5), size=(100, 25))run_all_btn.Bind(wx.EVT_BUTTON, self.on_run_all)self.SetSize((360, 375))self.Centre()def on_select(self, event):dlg = wx.DirDialog(self, "选择一个文件夹", style=wx.DD_DEFAULT_STYLE)if dlg.ShowModal() == wx.ID_OK:self.folder_path = dlg.GetPath()self.exe_files = self.get_exe_files(self.folder_path)self.list_box.Set(self.exe_files)dlg.Destroy()def get_exe_files(self, folder):exe_files = []for root, dirs, files in os.walk(folder):for file in files:if file.endswith('.exe'):exe_files.append(os.path.join(root, file))return exe_filesdef on_dclick(self, event):index = event.GetSelection()self.run_exe(self.exe_files[index])def on_run_all(self, event):for exe in self.exe_files:self.run_exe(exe)def run_exe(self, exe_path):try:subprocess.Popen(exe_path)wx.Sleep(2)  # 等待程序启动self.take_screenshot(exe_path)except Exception as e:wx.MessageBox(f"运行 {exe_path} 时出错: {str(e)}", "错误", wx.OK | wx.ICON_ERROR)def take_screenshot(self, exe_path):screenshot = pyautogui.screenshot()exe_name = os.path.splitext(os.path.basename(exe_path))[0]screenshot_folder = os.path.join(os.path.dirname(exe_path), "screenshot")if not os.path.exists(screenshot_folder):os.makedirs(screenshot_folder)screenshot_path = os.path.join(screenshot_folder, f"{exe_name}.png")screenshot.save(screenshot_path)if __name__ == '__main__':app = wx.App()frame = MainFrame()frame.Show()app.MainLoop()

代码解析

让我们深入了解代码的关键部分:

1. 用户界面

我们使用wxPython创建了一个简洁的用户界面,包含一个列表框和两个按钮:

class MainFrame(wx.Frame):def __init__(self):super().__init__(parent=None, title='EXE Runner and Screenshot Tool')panel = wx.Panel(self)self.list_box = wx.ListBox(panel, pos=(5, 35), size=(350, 300), style=wx.LB_SINGLE)self.list_box.Bind(wx.EVT_LISTBOX_DCLICK, self.on_dclick)select_btn = wx.Button(panel, label='选择文件夹', pos=(5, 5), size=(100, 25))select_btn.Bind(wx.EVT_BUTTON, self.on_select)run_all_btn = wx.Button(panel, label='运行全部', pos=(110, 5), size=(100, 25))run_all_btn.Bind(wx.EVT_BUTTON, self.on_run_all)

2. 文件遍历

我们使用os.walk()来递归遍历文件夹及其子文件夹,查找所有的EXE文件:

def get_exe_files(self, folder):exe_files = []for root, dirs, files in os.walk(folder):for file in files:if file.endswith('.exe'):exe_files.append(os.path.join(root, file))return exe_files

3. 运行EXE文件

我们使用subprocess.Popen()来运行EXE文件:

def run_exe(self, exe_path):try:subprocess.Popen(exe_path)wx.Sleep(2)  # 等待程序启动self.take_screenshot(exe_path)except Exception as e:wx.MessageBox(f"运行 {exe_path} 时出错: {str(e)}", "错误", wx.OK | wx.ICON_ERROR)

4. 屏幕截图

我们使用pyautogui来捕获屏幕截图,并使用PIL来保存图像:

def take_screenshot(self, exe_path):screenshot = pyautogui.screenshot()exe_name = os.path.splitext(os.path.basename(exe_path))[0]screenshot_folder = os.path.join(os.path.dirname(exe_path), "screenshot")if not os.path.exists(screenshot_folder):os.makedirs(screenshot_folder)screenshot_path = os.path.join(screenshot_folder, f"{exe_name}.png")screenshot.save(screenshot_path)

潜在应用场景

这个工具可以在多种场景下发挥作用:

  1. 软件测试: 自动运行多个程序并捕获截图,可以大大提高测试效率。
  2. 系统管理: 快速查看和运行系统中的可执行文件,对系统管理员很有帮助。
  3. 软件开发: 在开发过程中快速测试和记录多个可执行文件的运行状态。
  4. 教育: 作为一个教学工具,展示如何使用Python创建实用的桌面应用程序。

改进空间

虽然这个工具已经相当实用,但仍有一些可以改进的地方:

  1. 添加进度条,显示当前正在运行的程序和截图进度。
  2. 实现更灵活的截图时间控制,因为不同程序可能需要不同的启动时间。
  3. 添加选项来自动关闭运行的程序。
  4. 实现更robust的错误处理和日志记录机制。
  5. 添加对非EXE文件的支持,如批处理文件或其他可执行文件。

运行结果

在这里插入图片描述

相关文章:

  • 【OS】计算机系统概述|操作系统基本概念|并发|并行|虚拟异步
  • Stable Diffusion 的 ControlNet 主要用途
  • 【APM】在Kubernetes中,使用Helm安装loki-distributed 3.1.1
  • 【高效管理集合】并查集的实现与应用
  • 【工具分享】BlackBasta勒索病毒解密工具
  • C语言扫盲
  • 2、Stable Diffusion
  • Latex 自定义运算符加限定条件的实现
  • 2024年7天自学网络安全(黑客技术)进阶手册。
  • 大语言模型之LlaMA系列- LlaMA 2及LLaMA2_chat(上)
  • HAproxy,nginx实现七层负载均衡
  • AMBER学习记录--使用Multiwfn计算有机小分子的RESP电荷--问题及解决
  • 从Midjourney到秒画:探索国产AI绘图的崛起与未来
  • Python Web WebAssembly 与 Python 的协同工作
  • GO语言中make与new的区别
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 3.7、@ResponseBody 和 @RestController
  • ES6系统学习----从Apollo Client看解构赋值
  • extjs4学习之配置
  • Java反射-动态类加载和重新加载
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Odoo domain写法及运用
  • Quartz初级教程
  • Rancher如何对接Ceph-RBD块存储
  • Spark RDD学习: aggregate函数
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vue 配置sass、scss全局变量
  • vue-cli在webpack的配置文件探究
  • 从零开始的无人驾驶 1
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 多线程事务回滚
  • 排序算法之--选择排序
  • 无服务器化是企业 IT 架构的未来吗?
  • 硬币翻转问题,区间操作
  • 转载:[译] 内容加速黑科技趣谈
  • 追踪解析 FutureTask 源码
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 整理一些计算机基础知识!
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • (1)无线电失控保护(二)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (南京观海微电子)——示波器使用介绍
  • (十三)Flask之特殊装饰器详解
  • (转)c++ std::pair 与 std::make
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)LINQ之路
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .bat批处理(十一):替换字符串中包含百分号%的子串