159 lines
7.3 KiB
Python
159 lines
7.3 KiB
Python
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() |