Python 写个 《系统信息采集工具》为重装系统做准备。。。

图样:

原码:

# 系统信息采集工具
# 2024-12-18
# 作者:Hoye
# 版本:1.0
# 功能:采集系统信息并保存到文件
# 使用方法:
# 1. 运行程序
# 2. 点击“采集系统信息”按钮
# 3. 等待信息采集完成
# 4. 选择保存位置
# 5. 点击“保存信息”按钮
# pyinstaller -F 7_系统信息采集工具.pyimport win32print
import socket
import subprocess
import win32com.shell.shell as shell
import win32com.shell.shellcon as shellcon
import wmi
from datetime import date
import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext, filedialog
from threading import Thread
import os
import pythoncomclass SystemInfoApp:def __init__(self, root):self.root = rootself.root.title("蓝动力电脑-系统信息采集工具")self.root.geometry("800x600")# 设置整体样式style = ttk.Style()style.configure('TButton', padding=5)style.configure('TLabel', padding=5)self.create_widgets()def create_widgets(self):# 创建主框架main_frame = ttk.Frame(self.root, padding="10")main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))# 创建按钮框架button_frame = ttk.Frame(main_frame)button_frame.grid(row=0, column=0, pady=5, sticky=tk.W)# 采集按钮self.collect_btn = ttk.Button(button_frame, text="采集系统信息", command=self.start_collection)self.collect_btn.grid(row=0, column=0, padx=5)# 保存按钮self.save_btn = ttk.Button(button_frame, text="保存信息", command=self.save_info)self.save_btn.grid(row=0, column=1, padx=5)# 进度条self.progress = ttk.Progressbar(main_frame, orient=tk.HORIZONTAL, length=300, mode='determinate')self.progress.grid(row=1, column=0, pady=5, sticky=tk.EW)# 信息显示区域self.info_text = scrolledtext.ScrolledText(main_frame, width=80, height=30, wrap=tk.WORD)self.info_text.grid(row=2, column=0, pady=5, sticky=(tk.W, tk.E, tk.N, tk.S))# 状态标签self.status_label = ttk.Label(main_frame, text="就绪")self.status_label.grid(row=3, column=0, pady=5, sticky=tk.W)# 设置列和行的权重self.root.columnconfigure(0, weight=1)self.root.rowconfigure(0, weight=1)main_frame.columnconfigure(0, weight=1)main_frame.rowconfigure(2, weight=1)def get_basic_info(self):"""获取基本系统信息"""info = []self.update_status("正在获取基本系统信息...")computer_name = socket.gethostname()try:s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.connect(("8.8.8.8", 80))ip_address = s.getsockname()[0]s.close()except Exception as e:ip_address = "无法获取IP地址"info.extend(["=== 基本系统信息 ===",f"计算机名: {computer_name}",f"IP 地址: {ip_address}",""])return infodef get_printer_info(self):"""获取打印机信息"""self.update_status("正在获取打印机信息...")try:printers = win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL, None, 1)info = ["=== 打印机信息 ==="]info.extend([f"打印机名称: {printer[2]}" for printer in printers])info.append("")return infoexcept Exception:return ["=== 打印机信息 ===", "无法获取打印机信息", ""]def get_hardware_info(self):"""获取硬件信息"""self.update_status("正在获取硬件信息...")try:c = wmi.WMI()info = []# 计算机系统信息info.append("=== 计算机系统信息 ===")for computer in c.Win32_ComputerSystem():info.extend([f"计算机名称: {computer.Name}",f"制造商: {computer.Manufacturer}",f"型号: {computer.Model}",""])# CPU信息info.append("=== CPU信息 ===")for processor in c.Win32_Processor():info.extend([f"CPU型号: {processor.Name}",f"CPU ID: {processor.ProcessorId}",f"CPU核心数: {processor.NumberOfCores}",f"CPU线程数: {processor.NumberOfLogicalProcessors}",""])# 硬盘信息info.append("=== 硬盘信息 ===")for disk in c.Win32_DiskDrive():size_gb = round(int(disk.Size or 0) / (1024**3), 2)info.extend([f"硬盘型号: {disk.Model}",f"硬盘序列号: {disk.SerialNumber}",f"硬盘容量: {size_gb}GB",""])return infoexcept Exception as e:return ["=== 硬件信息 ===", f"获取硬件信息出错: {str(e)}", ""]def get_folder_paths(self):"""获取重要文件夹路径"""self.update_status("正在获取系统文件夹路径...")try:desktop = shell.SHGetFolderPath(0, shellcon.CSIDL_DESKTOP, 0, 0)documents = shell.SHGetFolderPath(0, shellcon.CSIDL_PERSONAL, 0, 0)info = ["=== 系统文件夹路径 ===",f"桌面位置: {desktop}",f"我的文档位置: {documents}",""]return infoexcept Exception as e:return ["=== 系统文件夹路径 ===", "无法获取文件夹路径", str(e), ""]def get_network_shares(self):"""获取网络共享信息"""self.update_status("正在获取网络共享信息...")try:output = subprocess.check_output("net share", shell=True, text=True)info = ["=== 网络共享信息 ===",output,""]return infoexcept subprocess.CalledProcessError as e:return ["=== 网络共享信息 ===", f"获取网络共享信息出错: {str(e)}", ""]def get_installed_software(self):"""获取已安装的软件信息"""self.update_status("正在获取已安装软件信息...")try:c = wmi.WMI()info = ["=== 已安装软件信息 ==="]# 获取已安装的软件for product in c.Win32_Product():if product.Name:  # 确保名称不为空info.extend([f"名称: {product.Name}",f"版本: {product.Version}",f"发布商: {product.Vendor}",f"安装日期: {product.InstallDate}","-" * 50  # 分隔线])info.append("")return infoexcept Exception as e:return ["=== 已安装软件信息 ===", f"获取已安装软件信息出错: {str(e)}", ""]def collect_info(self):"""收集所有系统信息"""# 在新线程中初始化 COMpythoncom.CoInitialize()self.progress["value"] = 0self.info_text.delete(1.0, tk.END)all_info = []try:# 获取基本信息all_info.extend(self.get_basic_info())self.progress["value"] = 15# 获取文件夹路径all_info.extend(self.get_folder_paths())self.progress["value"] = 30# 获取打印机信息all_info.extend(self.get_printer_info())self.progress["value"] = 45# 获取硬件信息all_info.extend(self.get_hardware_info())self.progress["value"] = 60# 获取已安装软件信息all_info.extend(self.get_installed_software())self.progress["value"] = 85# 获取网络共享信息all_info.extend(self.get_network_shares())self.progress["value"] = 100# 显示信息self.info_text.insert(tk.END, "\n".join(all_info))self.update_status("信息采集完成")finally:# 完成后取消初始化 COMpythoncom.CoUninitialize()def start_collection(self):"""在新线程中启动信息收集"""self.collect_btn["state"] = "disabled"Thread(target=self.collect_info, daemon=True).start()self.collect_btn["state"] = "normal"def save_info(self):"""保存信息到文件"""if not self.info_text.get(1.0, tk.END).strip():messagebox.showwarning("警告", "没有可保存的信息,请先采集系统信息")returntry:date_str = date.today().strftime("%Y-%m-%d")computer_name = socket.gethostname()# 默认文件名default_filename = f"{computer_name}_info_{date_str}.txt"# 创建保存选项按钮框架save_window = tk.Toplevel(self.root)save_window.title("选择保存位置")save_window.geometry("300x200")save_window.transient(self.root)  # 设置为主窗口的子窗口def save_to_network():try:network_path = f"\\\\bpc\\temp_g\\{default_filename}"with open(network_path, "w", encoding="utf-8") as f:f.write(self.info_text.get(1.0, tk.END))messagebox.showinfo("成功", f"信息已保存到网络位置:\n{network_path}")save_window.destroy()except Exception as e:messagebox.showerror("错误", f"保存到网络位置失败:\n{str(e)}")def save_to_local():initial_dir = os.path.expanduser("~\\Documents")  # 默认打开我的文档filename = filedialog.asksaveasfilename(parent=save_window,initialdir=initial_dir,initialfile=default_filename,defaultextension=".txt",filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")])if filename:try:with open(filename, "w", encoding="utf-8") as f:f.write(self.info_text.get(1.0, tk.END))messagebox.showinfo("成功", f"信息已保存到:\n{filename}")save_window.destroy()except Exception as e:messagebox.showerror("错误", f"保存文件时出错:\n{str(e)}")def save_to_d_drive():try:# 确保D盘存在if not os.path.exists("D:\\"):messagebox.showerror("错误", "未找到D盘")return# 在D盘根目录创建文件d_drive_path = f"D:\\{default_filename}"with open(d_drive_path, "w", encoding="utf-8") as f:f.write(self.info_text.get(1.0, tk.END))messagebox.showinfo("成功", f"信息已保存到:\n{d_drive_path}")save_window.destroy()except Exception as e:messagebox.showerror("错误", f"保存到D盘失败:\n{str(e)}")# 创建保存选项按钮ttk.Label(save_window, text="请选择保存位置:", padding=10).pack()ttk.Button(save_window,text="保存到网络位置(\\\\bpc\\temp_g)",command=save_to_network,padding=5).pack(pady=5, padx=10, fill=tk.X)ttk.Button(save_window,text="保存到D盘",command=save_to_d_drive,padding=5).pack(pady=5, padx=10, fill=tk.X)ttk.Button(save_window,text="保存到本地位置",command=save_to_local,padding=5).pack(pady=5, padx=10, fill=tk.X)# 居中显示窗口save_window.update_idletasks()width = save_window.winfo_width()height = save_window.winfo_height()x = (save_window.winfo_screenwidth() // 2) - (width // 2)y = (save_window.winfo_screenheight() // 2) - (height // 2)save_window.geometry(f'{width}x{height}+{x}+{y}')# 模态对话框save_window.grab_set()save_window.focus_set()except Exception as e:messagebox.showerror("错���", f"创建保存对话框时出错:\n{str(e)}")def update_status(self, message):"""更新状态栏消息"""self.status_label["text"] = messageself.root.update()def main():root = tk.Tk()app = SystemInfoApp(root)root.mainloop()if __name__ == "__main__":main()

打包 exe:

pip install pyinstaller

 version_info.txt

# UTF-8
#
# For more details about fixed file info 'ffi' see:
# http://msdn.microsoft.com/en-us/library/ms646997.aspx
VSVersionInfo(ffi=FixedFileInfo(# filevers和prodvers应该始终是包含4个项的元组filevers=(1, 0, 0, 0),prodvers=(1, 0, 0, 0),# 包含一个位掩码,指定文件的有效信息mask=0x3f,# 包含一个位掩码,指定布尔属性的文件flags=0x0,# 操作系统OS=0x40004,# 文件类型fileType=0x1,# 文件子类型subtype=0x0,# 创建日期date=(0, 0)),kids=[StringFileInfo([StringTable('080404b0',[StringStruct('CompanyName', '蓝动力电脑'),StringStruct('FileDescription', '系统信息采集工具'),StringStruct('FileVersion', '1.0.0'),StringStruct('InternalName', 'SystemInfoCollector'),StringStruct('LegalCopyright', 'Copyright (C) 2024 Hoye'),StringStruct('OriginalFilename', 'SystemInfoCollector.exe'),StringStruct('ProductName', '系统信息采集工具'),StringStruct('ProductVersion', '1.0.0')])]), VarFileInfo([VarStruct('Translation', [2052, 1200])])]
) 

 build.py

import PyInstaller.__main__
import os# 确保当前工作目录正确
current_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(current_dir)PyInstaller.__main__.run(['7_系统信息采集工具.py','--name=SystemInfoCollector','--windowed',# '--icon=app.ico',  # 如果您有图标文件的话'--version-file=version_info.txt','--clean','--noconfirm','--uac-admin',  # 添加管理员权限'--onefile',    # 打包成单一文件f'--workpath={os.path.join(current_dir, "build")}',f'--distpath={os.path.join(current_dir, "dist")}',f'--specpath={current_dir}'
]) 

python build.py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/64687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu搭建ES8集群+加密通讯+https访问

目录 写在前面 一、前期准备 1. 创建用户和用户组 2. 修改limits.conf文件 3. 关闭操作系统swap功能 4. 调整mmap上限 二、安装ES 1.下载ES 2.配置集群间安全访问证书密钥 3.配置elasticsearch.yml 4.修改jvm.options 5.启动ES服务 6.修改密码 7.启用外部ht…

【Linux】磁盘空间莫名消失,找不到具体原因的思路

磁盘空间莫名消失,找不到具体原因的思路 先说下常见的几种原因: 1、删除的文件未释放空间 2、日志或过期文件未及时清理 3、inode导致 4、隐藏文件夹或者目录 6、磁盘碎片 最后一种单独介绍。 环境:情况是根分区(/&#xf…

机动车油耗计算API集成指南

机动车油耗计算API集成指南 引言 在当今社会,随着机动车数量的持续增长和环保意识的不断增强,如何有效管理和降低车辆油耗成为了车主、车队管理者以及交通政策制定者共同关注的问题。为了帮助这些群体更好地理解和优化燃油消耗情况,本接口能…

Fiddle突然抓不到虚拟机的地址

Fiddle不抓虚拟机的地址了 查看是否更换了ip地址,我是因为换了网络 更换正确的ip地址

C语言基础(五)【控制语句与循环综合应用篇猜数字游戏】

文章目录 前言一、实现一个猜数字游戏二、游戏实现的步骤1. 随机数生成1.1 rand1.2 srand1.3 time1.4 设置随机数的范围 2. 菜单函数的实现 3. 游戏函数的实现 二、猜数字游戏的实现1. 不限制次数 2. 限制次数为 5 总结 前言 学习过前面有关控制语句跟循环的相关知识&#xf…

javac 编译java文件源码 怎么生成 ast语法树 步骤详解

在 javac 中,编译源代码并生成抽象语法树(AST)是一个多步骤的过程,涉及从源码解析到最终生成字节码。以下是详细步骤,描述了如何使用 javac 编译源码并生成 AST。 1. 准备源文件 javac 首先需要源文件。这些源文件是…

手游和应用出海资讯:怪物猎人AR手游累计总收入已超过2.5亿美元、SuperPlay获得迪士尼纸牌游戏发行许可

NetMarvel帮助游戏和应用广告主洞察全球市场、获取行业信息,以下为12月第一周资讯: ● 怪物猎人AR手游累计总收入已超过 2.5 亿美元 ● SuperPlay获得迪士尼纸牌游戏发行许可 ● 腾讯混元大模型上线文生视频能力 ● 网易天下事业部一拆三,蛋仔…

酷克数据携手江西移动入选“星河(Galaxy)”数据库潜力案例

2024 年 12 月 18 - 19 日,为推动打造行业交流平台,驱动产业创新共荣,大数据技术标准推进委员会以“数据重塑价值 智能链接未来”为主题,在北京召开为期两天的“2024 数据资产管理大会”。 在会上,第八届大数据“星河&…

Mysql语法之DQL查询的多行函数

Mysql的多行函数和分组 目录 Mysql的多行函数和分组多行函数概念常用的多行函数 数据分组概念语法where和having的区别 语句关键字及执行顺序语句关键字执行顺序 实际操作基本语句格式和多行操作筛选语句格式 多行函数 概念 不管函数处理多少条,只返回一条记录&…

Ubuntu22.04上安装esp-idf

一、安装准备# 建议使用Ubuntu 20.04 或 Ubuntu 22.04 操作系统 为了在 Ubuntu 22.04 中使用 esp-idf,需要安装一些依赖包 sudo apt-get install git wget flex bison gperf python3\python3-pip python3-venv cmake ninja-build ccache\libffi-dev libssl-dev dfu…

WPF 依赖属性和附加属性

除了普通的 CLR 属性, WPF 还有一套自己的属性系统。这个系统中的属性称为依赖属性。 1. 依赖属性 为啥叫依赖属性?不叫阿猫阿狗属性? 通常我们定义一个普通 CLR 属性,其实就是获取和设置一个私有字段的值。假设声明了 100 个 …

在linux系统的docker中安装GitLab

一、安装GitLab: 在安装了docker之后就是下载安装GitLab了,在linux系统中输入命令:docker search gitlab就可以看到很多项目,一般安装第一个,它是英文版的,如果英文不好可以安装twang2218/gitlab-ce-zh。 …

2024最新CF罗技鼠标宏

使用效果: 支持的功能 M4 7发一个点HK417 连点瞬狙炼狱加特林一个圈 下载链接 点击下载

JS CSS HTML 的代码如何快速封装

我们为什么要封装代码,是因为封装后的代码,会显得非常美观,减少代码的复用,方便我们更好的去维护代码,不用一个一个页面的去找去改,直接封装好的代码里面去改就可以了 目录 1.html代码封装 2.CSS代码封装…

使用docker拉取镜像很慢或者总是超时的问题

在拉取镜像的时候比如说mysql镜像,在拉取 时总是失败: 像这种就是网络的原因,因为你是连接到了外网去进行下载的,这个时候可以添加你的访问镜像源。也就是daemon.json文件,如果你没有这个文件可以输入 vim /etc/dock…

MySQL复制问题和解决

目录 环境介绍 一,主库执行delete,从库没有该数据 模拟故障 修复故障 二,主库执行insert,从库已存在该数据 模拟故障 故障恢复 三,主库执行update,从库没有该数据 模拟故障 故障恢复 四&#xf…

[RocketMQ] 发送重试机制与消费重试机制~

发送重试 RocketMQ 客户端发送消息时,由于网络故障等因素导致消息发送失败,这时客户端SDK会触发重试机制,尝试重新发送以达到调用成功的效果。 触发条件 客户端消息发送请求失败或超时。服务端节点处于重启或下线状态。服务端运行慢造成请…

mfc140u.dll是什么文件?如何解决mfc140u.dll丢失的相关问题

遇到“mfc140u.dll文件丢失”的错误通常影响应用程序的运行,这个问题主要出现在使用Microsoft Visual C环境开发的软件中。mfc140u.dll是一个重要的系统文件,如果它丢失或损坏,会导致相关程序无法启动。本文将简要介绍几种快速有效的方法来恢…

02-9.python入门基础一Python模块与包(一)

一、Python 模块的概念 (一)模块的基本定义 在 Python 中,模块(Module)是一种组织代码的基本单元,简单来说,一个以 .py 结尾的 Python 文件就是一个模块。例如,我们创建一个名为 ex…

当我用影刀AI Power做了一个旅游攻略小助手

在线体验地址:旅游攻略小助手https://power.yingdao.com/assistant/ca1dfe1c-9451-450e-a5f1-d270e938a3ad/share 运行效果图展示: 话不多说一起看下效果图: 智能体的截图: 工作流截图: 搭建逻辑: 其实这…