Files
Network-tools/core/ui/tab_network.py
T
2025-11-02 14:24:38 +08:00

159 lines
7.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
import threading
import re
import logging
from core.ui.basic_ui import BasicUI
from core.Function.network_fun import NetworkManager
logger = logging.getLogger(__name__)
class NetworkTab(ttk.Frame, BasicUI):
"""网卡配置 Tab(兼容最新 NetworkManager"""
def __init__(self, parent):
super().__init__(parent)
self.networkname_list = []
self.networkconfig = []
self.build_ui()
self.netmgr = NetworkManager(self.result_box)
def build_ui(self):
self.create_iface_section()
self.create_config_section()
self.create_action_section()
self.create_output_section()
def refresh_allnetwork(self):
'''刷新网卡列表'''
self.networkname_list = []
try:
self.networkconfigs = self.netmgr.get_network_info()
for config in self.networkconfigs:
self.networkname_list.append(config.get("name", "未知网卡"))
self.iface_cb['combobox']['values'] = self.networkname_list
if self.iface_cb['var'].get() == "" :
self.iface_cb['var'].set(self.networkname_list[0])
self.result_box.insert(tk.END, f"获取网卡信息完成,共:{len(self.networkname_list)}个启用网卡\n")
self.refresh_network_callback()
logger.info(f"获取网卡信息完成,共:{len(self.networkname_list)}个启用网卡")
logger.info(f"所有获取网卡信息:{self.networkconfigs}")
except Exception as e:
messagebox.showerror("错误", f"获取网卡信息失败: {e}")
logger.error(f"获取网卡信息失败: {e}")
self.networkconfigs = []
# ---------------- UI 构建 ----------------
def create_iface_section(self):
frame = ttk.LabelFrame(self, text="网卡选择", padding=8)
frame.pack(side='top', fill='x', padx=10, pady=6)
self.iface_cb = self.add_combobox(frame, "选择网卡", row=0, col=0, listbox=[], width=42, inivar=-1)
self.iface_cb['combobox'].bind("<<ComboboxSelected>>", lambda e: self.refresh_network_callback())
self.refresh_btn = self.add_button(frame, "刷新网卡列表", row=0, col=1, width=15, command=self.refresh_allnetwork)
self.description_entry = self.add_input(frame, "网卡名称", row=1, col=0, inivar="", entry_width=45)
self.description_entry['entry'].config(state='disabled')
self.mac_entry = self.add_input(frame, "MAC地址", row=1, col=1, inivar="", entry_width=35)
self.mac_entry['entry'].config(state='disabled')
def create_config_section(self):
frame = ttk.LabelFrame(self, text="IP 配置(编辑后点击应用)", padding=8)
frame.pack(side='top', fill='x', padx=10, pady=6)
self.ip_entry = self.add_input(frame, "IPv4 地址", row=0, col=0, inivar="", entry_width=20)
self.mask_entry = self.add_input(frame, "子网掩码", row=0, col=1, inivar="", entry_width=20)
self.gw_entry = self.add_input(frame, "默认网关", row=0, col=2, inivar="", entry_width=20)
#self.dns1_entry = self.add_input(frame, "主 DNS", row=1, col=0, inivar="", entry_width=20)
#self.dns2_entry = self.add_input(frame, "备选 DNS", row=1, col=1, inivar="", entry_width=20)
self.dhcp_cb = self.add_combobox(frame, "自动获取", row=2, col=0, listbox=["是","否"], width=5, inivar=-1)
self.dhcp_cb['combobox'].bind("<<ComboboxSelected>>", lambda e: self.dhcp_entry_state())
def create_action_section(self):
frame = ttk.LabelFrame(self, text="修改操作", padding=8)
frame.pack(side='top', fill='x', padx=10, pady=6)
self.apply_btn = self.add_button(frame, "应用修改", row=0, col=0, width=10, command=self.apply_btn_callback)
self.refresh_info_btn = self.add_button(frame, "刷新当前信息", row=0, col=2, width=15, command=self.refresh_allnetwork)
def create_output_section(self):
frame = ttk.LabelFrame(self, text="输出信息", padding=6)
frame.pack(side='top', fill='both', expand=True, padx=10, pady=6)
self.result_box = scrolledtext.ScrolledText(frame, width=100, height=12)
self.result_box.pack(fill='both', expand=True, padx=4, pady=4)
# ---------------- 事件回调 ----------------
def refresh_network_callback(self):
'''刷新当前网卡信息'''
# 刷新所有所有网卡信息
#self.refresh_allnetwork()
# 获取选中的网卡信息
iface_name = self.iface_cb['var'].get()
config = self.get_network_config(iface_name)
# 不可修改配置
self.description_entry['var'].set(config.get("description", ""))
self.mac_entry['var'].set(config.get("mac", ""))
# 可修改配置
self.ip_entry['var'].set(config.get("ipv4", ""))
self.mask_entry['var'].set(config.get("netmask", ""))
self.gw_entry['var'].set(config.get("gateway", ""))
#self.dns1_entry['var'].set(config.get("dns1", ""))
#self.dns2_entry['var'].set(config.get("dns2", ""))
if config.get("dhcp_enabled", "") == "是":
self.dhcp_cb['var'].set("是")
elif config.get("dhcp_enabled", "") == "否":
self.dhcp_cb['var'].set("否")
else:
self.dhcp_cb['var'].set("")
self.dhcp_entry_state()
self.get_network_settings()
self.output_network_settings()
def get_network_config(self, iface_name):
'''根据网卡名称获取对应的配置信息'''
for config in self.networkconfigs:
if config.get("name") == iface_name:
return config
return None
def dhcp_entry_state(self):
'''根据 DHCP 选择框设置输入框状态'''
if self.dhcp_cb['var'].get() == "是":
# 禁用手动输入
self.ip_entry['entry'].config(state='disabled')
self.mask_entry['entry'].config(state='disabled')
self.gw_entry['entry'].config(state='disabled')
else:
# 启用手动输入
self.ip_entry['entry'].config(state='normal')
self.mask_entry['entry'].config(state='normal')
self.gw_entry['entry'].config(state='normal')
def get_network_settings(self):
'''获取当前输入的网卡配置信息'''
self.networkconfig = {
"name": re.sub(r"^(.*?(适配器))\s*", "", self.iface_cb['var'].get()).strip(),
"ipv4": self.ip_entry['var'].get(),
"netmask": self.mask_entry['var'].get(),
"gateway": self.gw_entry['var'].get(),
#"dns1": self.dns1_entry['var'].get(),
#"dns2": self.dns2_entry['var'].get(),
"dhcp_enabled": self.dhcp_cb['var'].get() == "是"
}
def output_network_settings(self):
'''输出当前网卡配置信息到日志框'''
self.result_box.insert(tk.END, f"当前网卡配置:\n")
for key, value in self.networkconfig.items():
self.result_box.insert(tk.END, f" {key}: {value}\n")
self.result_box.see(tk.END)
def apply_btn_callback(self):
'''应用当前网卡配置信息'''
self.get_network_settings()
self.netmgr.set_network_info(self.networkconfig)
#self.refresh_allnetwork()