**
效果展示
**
**
代码介绍
**
1. 库和模块
subprocess:用于执行系统命令(如获取 WiFi 配置),捕获命令的输出。
tkinter:Python 的标准 GUI 库,用于创建窗口和界面组件。
Text:tkinter 中的文本框,用于显示 WiFi 网络和密码。
messagebox:tkinter 的对话框模块,用于显示消息框(如成功、警告和错误信息)。
chardet:用于检测字节流的编码,确保正确解码命令输出。
threading:用于创建线程,避免在加载 WiFi 列表时阻塞主界面。
pandas:用于处理和导出数据到 Excel 格式。
2. 功能实现
获取 WiFi 配置:
get_wifi_profiles():使用 subprocess.run 执行 netsh wlan show profiles 命令获取所有 WiFi 配置文件。
get_wifi_password(profile):获取特定 WiFi 配置文件的密码。
显示 WiFi 列表:
show_wifi_profiles():调用上面的两个函数,获取 WiFi 名称和密码,并在文本框中显示。
多线程处理:
threaded_show_wifi_profiles():使用线程运行 show_wifi_profiles(),避免界面在加载过程中无响应。
导出数据:
export_to_excel():使用 pandas 将 WiFi 数据导出为 Excel 文件。
3. 图形界面组件
主窗口 (root):
设置窗口标题、大小和图标。
按钮:
btn_show:点击后显示历史 WiFi 和密码。
btn_export:点击后导出 WiFi 列表到 Excel 文件。
文本框 (text_box):
显示 WiFi 名称和密码,使用不同的标签格式化文本颜色。
标签:
progress_label:显示加载进度。
wifi_count_label:显示已连接的 WiFi 数量。
4. 样式设置
文本样式:
通过 tag_configure 为 WiFi 名称和密码设置不同的颜色和字体样式。
5. 运行主循环
root.mainloop():启动 tkinter 的事件循环,保持窗口运行并响应用户操作。
**
部分源码
**
##完整源码gongzhonghao:PandaYY回复1018
import subprocess
import tkinter as tk
from tkinter import Text, messagebox
import chardet
import threading
import pandas as pd
def get_wifi_profiles():
try:
result = subprocess.run(['netsh', 'wlan', 'show', 'profiles'], capture_output=True)
encoding = chardet.detect(result.stdout)['encoding']
output = result.stdout.decode(encoding, errors='ignore')
profiles = [line.split(":")[1].strip() for line in output.splitlines() if "所有用户配置文件" in line]
return profiles
except Exception as e:
print(f"Error: {e}")
return []
def get_wifi_password(profile):
try:
result = subprocess.run(['netsh', 'wlan', 'show', 'profile', profile, 'key=clear'], capture_output=True)
encoding = chardet.detect(result.stdout)['encoding']
output = result.stdout.decode(encoding, errors='ignore')
for line in output.splitlines():
if "关键内容" in line:
return line.split(":")[1].strip()
return "没有密码"
except Exception as e:
print(f"Error: {e}")
return "错误"
def show_wifi_profiles():
profiles = get_wifi_profiles()
total_profiles = len(profiles)
text_box.delete(1.0, tk.END)
if total_profiles > 0:
max_name_length = 30
wifi_data = []
for index, profile in enumerate(profiles):
password = get_wifi_password(profile)
# 确保名称占据固定宽度并靠左对齐
formatted_profile = f"{profile:<{max_name_length}}"
text_box.insert(tk.END, formatted_profile, 'profile')
# 插入密码并对齐
text_box.insert(tk.END, f"{password}\n", 'password')
# 更新WiFi数据
wifi_data.append({'WiFi名称': profile, '密码': password})
# 更新进度
progress = (index + 1) / total_profiles * 100
progress_label.config(text=f"加载中... {progress:.0f}%")
text_box.insert(tk.END, "\n")
else:
text_box.insert(tk.END, "未找到任何网络。\n")
progress_label.config(text="加载完成")
wifi_count_label.config(text=f"已连接过的WiFi数量: {total_profiles}")
return wifi_data
def threaded_show_wifi_profiles():
progress_label.config(text="加载中... 0%")
wifi_count_label.config(text="")
show_wifi_profiles()