下载地址:https://www.pan38.com/dow/share.php?code=JCnzE 提取密码:2602
生成一个Python代码示例,实现一个完整的IP修改工具。这个工具包含GUI界面、IP配置逻辑和网络测试功能。
源码部分:
import tkinter as tk
from tkinter import ttk, messagebox
import subprocess
import socket
import re
import platform
import os
import sys
from threading import Thread
import time
class IPModifierApp:
def init(self, root):
self.root = root
self.root.title("高级IP修改工具 v2.0")
self.root.geometry("800x600")
self.root.resizable(False, False)
# 系统信息
self.system = platform.system()
self.current_ip = None
self.current_subnet = None
self.current_gateway = None
self.current_dns = None
# 样式配置
self.style = ttk.Style()
self.style.configure('TFrame', background='#f0f0f0')
self.style.configure('TLabel', background='#f0f0f0', font=('Arial', 10))
self.style.configure('TButton', font=('Arial', 10))
self.style.configure('Header.TLabel', font=('Arial', 12, 'bold'))
# 主框架
self.main_frame = ttk.Frame(root)
self.main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# 标题
self.title_label = ttk.Label(
self.main_frame,
text="网络配置修改工具",
style='Header.TLabel'
)
self.title_label.pack(pady=(0, 20))
# 当前配置显示区域
self.current_config_frame = ttk.LabelFrame(
self.main_frame,
text="当前网络配置"
)
self.current_config_frame.pack(fill=tk.X, pady=(0, 20))
self.create_current_config_widgets()
# 修改配置区域
self.modify_frame = ttk.LabelFrame(
self.main_frame,
text="修改网络配置"
)
self.modify_frame.pack(fill=tk.X, pady=(0, 20))
self.create_modify_widgets()
# 操作按钮区域
self.button_frame = ttk.Frame(self.main_frame)
self.button_frame.pack(fill=tk.X)
self.create_button_widgets()
# 日志区域
self.log_frame = ttk.LabelFrame(
self.main_frame,
text="操作日志"
)
self.log_frame.pack(fill=tk.BOTH, expand=True)
self.create_log_widgets()
# 初始化获取当前配置
self.refresh_current_config()
def create_current_config_widgets(self):
# IP地址
ttk.Label(
self.current_config_frame,
text="IP地址:"
).grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)
self.ip_label = ttk.Label(
self.current_config_frame,
text="正在获取..."
)
self.ip_label.grid(row=0, column=1, padx=5, pady=5, sticky=tk.W)
# 子网掩码
ttk.Label(
self.current_config_frame,
text="子网掩码:"
).grid(row=1, column=0, padx=5, pady=5, sticky=tk.W)
self.subnet_label = ttk.Label(
self.current_config_frame,
text="正在获取..."
)
self.subnet_label.grid(row=1, column=1, padx=5, pady=5, sticky=tk.W)
# 默认网关
ttk.Label(
self.current_config_frame,
text="默认网关:"
).grid(row=2, column=0, padx=5, pady=5, sticky=tk.W)
self.gateway_label = ttk.Label(
self.current_config_frame,
text="正在获取..."
)
self.gateway_label.grid(row=2, column=1, padx=5, pady=5, sticky=tk.W)
# DNS服务器
ttk.Label(
self.current_config_frame,
text="DNS服务器:"
).grid(row=3, column=0, padx=5, pady=5, sticky=tk.W)
self.dns_label = ttk.Label(
self.current_config_frame,
text="正在获取..."
)
self.dns_label.grid(row=3, column=1, padx=5, pady=5, sticky=tk.W)
# 刷新按钮
self.refresh_button = ttk.Button(
self.current_config_frame,
text="刷新配置",
command=self.refresh_current_config
)
self.refresh_button.grid(row=4, column=0, columnspan=2, pady=10)
def create_modify_widgets(self):
# IP地址
ttk.Label(
self.modify_frame,
text="新IP地址:"
).grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)
self.ip_entry = ttk.Entry(self.modify_frame, width=20)
self.ip_entry.grid(row=0, column=1, padx=5, pady=5)
# 子网掩码
ttk.Label(
self.modify_frame,
text="子网掩码:"
).grid(row=1, column=0, padx=5, pady=5, sticky=tk.W)
self.subnet_entry = ttk.Entry(self.modify_frame, width=20)
self.subnet_entry.grid(row=1, column=1, padx=5, pady=5)
# 默认网关
ttk.Label(
self.modify_frame,
text="默认网关:"
).grid(row=2, column=0, padx=5, pady=5, sticky=tk.W)
self.gateway_entry = ttk.Entry(self.modify_frame, width=20)
self.gateway_entry.grid(row=2, column=1, padx=5, pady=5)
# DNS服务器
ttk.Label(
self.modify_frame,
text="DNS服务器:"
).grid(row=3, column=0, padx=5, pady=5, sticky=tk.W)
self.dns_entry = ttk.Entry(self.modify_frame, width=20)
self.dns_entry.grid(row=3, column=1, padx=5, pady=5)
# 自动获取DHCP选项
self.dhcp_var = tk.BooleanVar()
self.dhcp_check = ttk.Checkbutton(
self.modify_frame,
text="自动获取IP (DHCP)",
variable=self.dhcp_var,
command=self.toggle_dhcp
)
self.dhcp_check.grid(row=4, column=0, columnspan=2, pady=5)
def create_button_widgets(self):
# 应用按钮
self.apply_button = ttk.Button(
self.button_frame,
text="应用配置",
command=self.apply_config,
style='TButton'
)
self.apply_button.pack(side=tk.LEFT, padx=5, pady=5)
# 测试连接按钮
self.test_button = ttk.Button(
self.button_frame,
text="测试连接",
command=self.test_connection
)
self.test_button.pack(side=tk.LEFT, padx=5, pady=5)
# 重置按钮
self.reset_button = ttk.Button(
self.button_frame,
text="重置表单",
command=self.reset_form
)
self.reset_button.pack(side=tk.LEFT, padx=5, pady=5)
# 退出按钮
self.exit_button = ttk.Button(
self.button_frame,
text="退出",
command=self.root.quit
)
self.exit_button.pack(side=tk.RIGHT, padx=5, pady=5)
def create_log_widgets(self):
self.log_text = tk.Text(
self.log_frame,
wrap=tk.WORD,
height=10,
state=tk.DISABLED
)
self.log_text.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
scrollbar = ttk.Scrollbar(
self.log_text,
command=self.log_text.yview
)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
self.log_text.config(yscrollcommand=scrollbar.set)
def toggle_dhcp(self):
if self.dhcp_var.get():
self.ip_entry.config(state=tk.DISABLED)
self.subnet_entry.config(state=tk.DISABLED)
self.gateway_entry.config(state=tk.DISABLED)
self.dns_entry.config(state=tk.DISABLED)
else:
self.ip_entry.config(state=tk.NORMAL)
self.subnet_entry.config(state=tk.NORMAL)
self.gateway_entry.config(state=tk.NORMAL)
self.dns_entry.config(state=tk.NORMAL)
def refresh_current_config(self):
self.log_message("正在获取当前网络配置...")
try:
if self.system == "Windows":
self.get_windows_config()
elif self.system == "Linux":
self.get_linux_config()
elif self.system == "Darwin":
self.get_mac_config()
else:
self.log_message("错误: 不支持的操作系统")
return
self.ip_label.config(text=self.current_ip or "未获取")
self.subnet_label.config(text=self.current_subnet or "未获取")
self.gateway_label.config(text=self.current_gateway or "未获取")
self.dns_label.config(text=self.current_dns or "未获取")
self.log_message("当前网络配置获取成功")
except Exception as e:
self.log_message(f"获取配置时出错: {str(e)}")
def get_windows_config(self):
try:
# 获取IP配置
result = subprocess.run(
["ipconfig", "/all"],
capture_output=True,
text=True
)
output = result.stdout
# 解析IP地址
ip_match = re.search(
r"IPv4 Address[\. ]+: ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)",
output
)
self.current_ip = ip_match.group(1) if ip_match else None
# 解析子网掩码
subnet_match = re.search(
r"Subnet Mask[\. ]+: ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)",
output
)
self.current_subnet = subnet_match.group(1) if subnet_match else None
# 解析默认网关
gateway_match = re.search(
r"Default Gateway[\. ]+: ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)",
output
)
self.current_gateway = gateway_match.group(1) if gateway_match else None
# 解析DNS服务器
dns_matches = re.findall(
r"DNS Servers[\. ]+: ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)",
output
)
self.current_dns = ", ".join(dns_matches) if dns_matches else None
except Exception as e:
raise Exception(f"Windows配置解析失败: {str(e)}")
def get_linux_config(self):
try:
# 获取IP配置
result = subprocess.run(
["ifconfig"],
capture_output=True,
text=True
)
output = result.stdout
# 解析IP地址和子网掩码
ip_match = re.search(
r"inet ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*?netmask ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)",
output
)
if ip_match:
self.current_ip = ip_match.group(1)
self.current_subnet = ip_match.group(2)
# 获取默认网关
route_result = subprocess.run(
["route", "-n"],
capture_output=True,
text=True
)
route_output = route_result.stdout
gateway_match = re.search(
r"0\.0\.0\.0\s+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)",
route_output
)
self.current_gateway = gateway_match.group(1) if gateway_match else None
# 获取DNS配置
try:
with open("/etc/resolv.conf", "r") as f:
dns_content = f.read()
dns_matches = re.findall(
r"nameserver\s+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)",
dns_content
)
self.current_dns = ", ".join(dns_matches) if dns_matches else None
except:
self.current_dns = None
except Exception as e:
raise Exception(f"Linux配置解析失败: {str(e)}")
def get_mac_config(self):
try:
# 获取IP配置
result = subprocess.run(
["ifconfig"],
capture_output=True,
text=True
)
output = result.stdout
# 解析IP地址和子网掩码
ip_match = re.search(
r"inet ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*?netmask ([0-9xabcdef]+)",
output
)
if ip_match:
self.current_ip = ip_match.group(1)
# 转换十六进制netmask为点分十进制
hex_mask = ip_match.group(2).lower().replace('0x', '')
self.current_subnet = self.hex_to_ip(hex_mask)
# 获取默认网关
route_result = subprocess.run(
["netstat", "-rn"],
capture_output=True,
text=True
)
route_output = route_result.stdout
gateway_match = re.search(
r"default\s+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)",
route_output
)
self.current_gateway = gateway_match.group(1) if gateway_match else None
# 获取DNS配置
try:
scutil_result = subprocess.run(
["scutil", "--dns"],
capture_output=True,
text=True
)
scutil_output = scutil_result.stdout
dns_matches = re.findall(
r"nameserver\[0\] : ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)",
scutil_output
)
self.current_dns = ", ".join(dns_matches) if dns_matches else None
except:
self.current_dns = None
except Exception as e:
raise Exception(f"Mac配置解析失败: {str(e)}")
def hex_to_ip(self, hex_str):
try:
# 将十六进制字符串转换为点分十进制IP
hex_str = hex_str.zfill(8)
parts = [
str(int(hex_str[i:i+2], 16))
for i in range(0, 8, 2)
]
return ".".join(parts)
except:
return None
def apply_config(self):
if self.dhcp_var.get():
self.set_dhcp()
return
# 获取输入值
ip = self.ip_entry.get().strip()
subnet = self.subnet_entry.get().strip()
gateway = self.gateway_entry.get().strip()
dns = self.dns_entry.get().strip()
# 验证输入
if not all([ip, subnet, gateway]):
messagebox.showerror("错误", "IP地址、子网掩码和默认网关是必填项")
return
if not self.validate_ip(ip):
messagebox.showerror("错误", "IP地址格式不正确")
return
if not self.validate_ip(subnet):
messagebox.showerror("错误", "子网掩码格式不正确")
return
if not self.validate_ip(gateway):
messagebox.showerror("错误", "默认网关格式不正确")
return
if dns and not self.validate_ip(dns):
messagebox.showerror("错误", "DNS服务器格式不正确")
return
# 确认操作
if not messagebox.askyesno("确认", "确定要修改网络配置吗?"):
return
try:
self.log_message("正在应用网络配置...")
if self.system == "Windows":
self.set_windows_config(ip, subnet, gateway, dns)
elif self.system == "Linux":
self.set_linux_config(ip, subnet, gateway, dns)
elif self.system == "Darwin":
self.set_mac_config(ip, subnet, gateway, dns)
else:
self.log_message("错误: 不支持的操作系统")
return
self.log_message("网络配置修改成功,请稍后刷新查看")
messagebox.showinfo("成功", "网络配置修改成功")
# 延迟刷新当前配置
self.root.after(3000, self.refresh_current_config)
except Exception as e:
self.log_message(f"修改配置时出错: {str(e)}")
messagebox.showerror("错误",