【子网掩码计算器:Python + Tkinter 实现】
子网掩码计算器:Python + Tkinter 实现
- 引言
- 代码功能概述
- 代码实现思路
- 1. 界面设计
- 2. 功能实现
- 3. 事件处理
- 子网掩码计算器实现步骤
- 1. 导入必要的库
- 2. 定义主窗口类 SubnetCalculatorApp
- 3. 创建菜单栏
- 4. 创建界面组件
- 5. 判断 IP 地址类别
- 6. 计算子网信息
- 7. 其他功能函数
- 代码运行效果
- 总结
- 完整代码
引言
在网络工程和网络管理领域,子网掩码的计算是一项基础且重要的工作。通过子网掩码,我们可以将一个大的网络划分为多个小的子网,从而提高网络的安全性和可管理性。今天,我们将介绍一个使用 Python 和 Tkinter 库实现的子网掩码计算器,它可以帮助我们快速计算子网信息,并且支持历史记录的查看和导出。
代码功能概述
这个子网掩码计算器具有以下主要功能:
- 输入验证:验证用户输入的 IP 地址和子网掩码 / CIDR 是否有效。
- 子网计算:根据输入的 IP 地址和子网掩码 / CIDR 计算网络地址、广播地址、可用 IP 数、可用 IP 范围等信息。
- IP 地址分类:判断输入的 IP 地址属于 A、B、C、D、E 类中的哪一类,以及是公网地址还是私有地址。
- 结果显示:将计算结果显示在界面上,并支持复制结果到剪贴板。
- 历史记录:保存最近 5 条计算结果,并支持查看和导出历史记录。
代码实现思路
1. 界面设计
- 使用 Tkinter 库创建一个图形用户界面(GUI),包括输入框、按钮、标签和表格等组件。
- 通过布局管理器(如 pack 和 grid)将这些组件排列在合适的位置。
2. 功能实现
- 输入验证:编写函数
validate_ip和validate_mask来验证 IP 地址和子网掩码的格式是否正确。 - 子网计算:
- 编写函数
ip_to_int和int_to_ip来实现 IP 地址和 32 位整数之间的转换。 - 根据子网掩码计算网络地址、广播地址等信息。
- 编写函数
- IP 地址分类:编写函数
get_ip_class来判断 IP 地址的类别。 - 历史记录管理:
- 使用列表
self.history来存储最近 5 条计算结果。 - 提供查看和导出历史记录的功能。
- 使用列表
3. 事件处理
- 为每个按钮绑定相应的事件处理函数,例如:
- 点击 “计算” 按钮时调用
calculate函数进行子网计算。 - 点击 “保存当前结果” 按钮时调用
save_current_result函数保存结果。
- 点击 “计算” 按钮时调用
子网掩码计算器实现步骤
1. 导入必要的库
import tkinter as tk
from tkinter import ttk, messagebox, filedialog
import csv
from datetime import datetime
这里导入了 Tkinter 库用于创建 GUI,csv 库用于处理 CSV 文件,datetime 库用于记录时间。
2. 定义主窗口类 SubnetCalculatorApp
class SubnetCalculatorApp(tk.Tk):def __init__(self):super().__init__()self.title("子网掩码计算器")self.geometry("650x470") # 调整窗口大小self.resizable(False, False)self.history = [] # 存储最近5条历史记录self.create_widgets()self.create_menu()
在 init 方法中,我们初始化了主窗口的标题、大小、是否可调整大小属性,并创建了一个空的历史记录列表。然后,我们调用了 create_widgets 和 create_menu 方法来创建界面组件和菜单栏。
3. 创建菜单栏
def create_menu(self):"""创建菜单栏"""menubar = tk.Menu(self)# 历史记录菜单history_menu = tk.Menu(menubar, tearoff=0)history_menu.add_command(label="查看历史记录", command=self.show_history)history_menu.add_command(label="导出历史记录...", command=self.export_history)menubar.add_cascade(label="历史记录", menu=history_menu)self.config(menu=menubar)
在 create_menu 方法中,我们创建了一个菜单栏,并为其添加了一个名为“历史记录”的子菜单。该子菜单包含两个选项:“查看历史记录”和“导出历史记录…”。当用户点击这些选项时,将分别调用 show_history 和 export_history 方法。最后,我们将菜单栏设置到主窗口中。
4. 创建界面组件
def create_widgets(self):"""创建界面组件"""# 输入区域input_frame = ttk.Frame(self)input_frame.pack(padx=10, pady=10, fill=tk.X)ttk.Label(input_frame, text="IP地址:").grid(row=0, column=0, sticky=tk.W)self.ip_entry = ttk.Entry(input_frame, width=20)self.ip_entry.grid(row=0, column=1, padx=5)ttk.Label(input_frame, text="子网掩码/CIDR:").grid(row=1, column=0, sticky=tk.W)self.mask_entry = ttk.Entry(input_frame, width=20)self.mask_entry.grid(row=1, column=1, padx=5)ttk.Button(input_frame, text="计算", command=self.calculate).grid(row=2, column=0, columnspan=2, pady=10)# 结果区域result_frame = ttk.LabelFrame(self, text="计算结果")result_frame.pack(padx=10, pady=5, fill=tk.BOTH, expand=True)result_labels = [("网络地址:", "network"),("广播地址:", "broadcast"),("可用IP数:", "hosts"),("可用IP范围:", "range"),("CIDR表示:", "cidr"),("子网掩码:", "mask"),("IP版本:", "version"),("网络类别:", "class") # 新增网络类别]for i, (label, _) in enumerate(result_labels):ttk.Label(result_frame, text=label).grid(row=i, column=0, sticky=tk.W, padx=5, pady=2)setattr(self, f"result_{label.split(':')[0]}", ttk.Label(result_frame, text=""))getattr(self, f"result_{label.split(':')[0]}").grid(row=i, column=1, sticky=tk.W, padx=5, pady=2)# 按钮区域button_frame = ttk.Frame(self)button_frame.pack(pady=5)ttk.Button(button_frame, text="保存当前结果", command=self.save_current_result).pack(side=tk.LEFT, padx=5)ttk.Button(button_frame, text="复制结果", command=self.copy_results).pack(side=tk.LEFT, padx=5)ttk.Button(button_frame, text="清除输入", command=self.clear_inputs).pack(side=tk.LEFT, padx=5)
这段代码创建了输入区域、结果区域和按钮区域,并为每个组件设置了相应的布局和事件处理函数。
5. 判断 IP 地址类别
def get_ip_class(self, ip_str):"""判断IP地址类别"""first_octet = int(ip_str.split('.')[0])if 1 <= first_octet <= 126:return "A类(公网地址)" if first_octet != 10 else "A类(私有地址)"elif 128 <= first_octet <= 191:if first_octet == 172 and 16 <= int(ip_str.split('.')[1]) <= 31:return "B类(私有地址)"return "B类(公网地址)"elif 192 <= first_octet <= 223:if first_octet == 192 and int(ip_str.split('.')[1]) == 168:return "C类(私有地址)"return "C类(公网地址)"elif 224 <= first_octet <= 239:return "D类(组播地址)"elif 240 <= first_octet <= 255:return "E类(保留地址)"elif first_octet == 127:return "环回地址"return "未知类别"
这个函数根据 IP 地址的第一个八位组判断其类别,并区分公网地址和私有地址。
6. 计算子网信息
def calculate(self):"""计算子网信息"""try:ip_str = self.ip_entry.get().strip()mask_str = self.mask_entry.get().strip().lstrip('/')if not self.validate_ip(ip_str):raise ValueError("无效的IP地址格式")# 获取网络类别ip_class = self.get_ip_class(ip_str)ip_int = self.ip_to_int(ip_str)mask_int, cidr = self.parse_mask(mask_str, ip_int)subnet_mask = self.int_to_ip(mask_int)network_int = ip_int & mask_intbroadcast_int = network_int | (~mask_int & 0xFFFFFFFF)hosts_count = max(broadcast_int - network_int - 1, 0)# 更新结果self.result_网络地址.config(text=self.int_to_ip(network_int))self.result_广播地址.config(text=self.int_to_ip(broadcast_int))self.result_可用IP数.config(text=f"{hosts_count} 个")self.result_CIDR表示.config(text=f"/{cidr}")self.result_子网掩码.config(text=subnet_mask)self.result_IP版本.config(text="IPv4")self.result_网络类别.config(text=ip_class) # 显示网络类别if hosts_count > 0:first_ip = self.int_to_ip(network_int + 1)last_ip = self.int_to_ip(broadcast_int - 1)self.result_可用IP范围.config(text=f"{first_ip} - {last_ip}")else:self.result_可用IP范围.config(text="无可用IP")except Exception as e:messagebox.showerror("错误", str(e))
在 calculate 函数中,首先验证输入的 IP 地址和子网掩码 / CIDR 是否有效,然后进行子网计算,并将结果显示在界面上。
7. 其他功能函数
代码中还包含了清空输入框、复制结果、保存当前结果、查看历史记录和导出历史记录等功能函数,这些函数的实现逻辑都比较简单,这里就不再详细介绍了。
代码运行效果
运行代码后,会弹出一个子网掩码计算器的窗口,界面如下:

用户可以在输入框中输入 IP 地址和子网掩码 / CIDR,点击 “计算” 按钮即可得到计算结果。点击 “保存当前结果” 按钮可以将结果保存到 CSV 文件中,点击 “复制结果” 按钮可以将结果复制到剪贴板。通过菜单栏中的 “历史记录” 菜单可以查看和导出最近 5 条计算结果。
总结
通过这个子网掩码计算器的实现,我们学习了如何使用 Python 和 Tkinter 库创建一个简单的 GUI 应用程序。同时,我们也掌握了子网计算的基本原理和 IP 地址分类的方法。希望这篇博客对你有所帮助,如果你有任何问题或建议,欢迎在评论区留言。
完整代码
import tkinter as tk
from tkinter import ttk, messagebox, filedialog
import csv
from datetime import datetimeclass SubnetCalculatorApp(tk.Tk):def __init__(self):super().__init__()self.title("子网掩码计算器")self.geometry("650x470") # 调整窗口大小self.resizable(False, False)self.history = [] # 存储最近5条历史记录self.create_widgets()self.create_menu()def create_menu(self):"""创建菜单栏"""menubar = tk.Menu(self)# 历史记录菜单history_menu = tk.Menu(menubar, tearoff=0)history_menu.add_command(label="查看历史记录", command=self.show_history)history_menu.add_command(label="导出历史记录...", command=self.export_history)menubar.add_cascade(label="历史记录", menu=history_menu)self.config(menu=menubar)def create_widgets(self):"""创建界面组件"""# 输入区域input_frame = ttk.Frame(self)input_frame.pack(padx=10, pady=10, fill=tk.X)ttk.Label(input_frame, text="IP地址:").grid(row=0, column=0, sticky=tk.W)self.ip_entry = ttk.Entry(input_frame, width=20)self.ip_entry.grid(row=0, column=1, padx=5)ttk.Label(input_frame, text="子网掩码/CIDR:").grid(row=1, column=0, sticky=tk.W)self.mask_entry = ttk.Entry(input_frame, width=20)self.mask_entry.grid(row=1, column=1, padx=5)ttk.Button(input_frame, text="计算", command=self.calculate).grid(row=2, column=0, columnspan=2, pady=10)# 结果区域result_frame = ttk.LabelFrame(self, text="计算结果")result_frame.pack(padx=10, pady=5, fill=tk.BOTH, expand=True)result_labels = [("网络地址:", "network"),("广播地址:", "broadcast"),("可用IP数:", "hosts"),("可用IP范围:", "range"),("CIDR表示:", "cidr"),("子网掩码:", "mask"),("IP版本:", "version"),("网络类别:", "class") # 新增网络类别]for i, (label, _) in enumerate(result_labels):ttk.Label(result_frame, text=label).grid(row=i, column=0, sticky=tk.W, padx=5, pady=2)setattr(self, f"result_{label.split(':')[0]}", ttk.Label(result_frame, text=""))getattr(self, f"result_{label.split(':')[0]}").grid(row=i, column=1, sticky=tk.W, padx=5, pady=2)# 按钮区域button_frame = ttk.Frame(self)button_frame.pack(pady=5)ttk.Button(button_frame, text="保存当前结果", command=self.save_current_result).pack(side=tk.LEFT, padx=5)ttk.Button(button_frame, text="复制结果", command=self.copy_results).pack(side=tk.LEFT, padx=5)ttk.Button(button_frame, text="清除输入", command=self.clear_inputs).pack(side=tk.LEFT, padx=5)def get_ip_class(self, ip_str):"""判断IP地址类别"""first_octet = int(ip_str.split('.')[0])if 1 <= first_octet <= 126:return "A类(公网地址)" if first_octet != 10 else "A类(私有地址)"elif 128 <= first_octet <= 191:if first_octet == 172 and 16 <= int(ip_str.split('.')[1]) <= 31:return "B类(私有地址)"return "B类(公网地址)"elif 192 <= first_octet <= 223:if first_octet == 192 and int(ip_str.split('.')[1]) == 168:return "C类(私有地址)"return "C类(公网地址)"elif 224 <= first_octet <= 239:return "D类(组播地址)"elif 240 <= first_octet <= 255:return "E类(保留地址)"elif first_octet == 127:return "环回地址"return "未知类别"def calculate(self):"""计算子网信息"""try:ip_str = self.ip_entry.get().strip()mask_str = self.mask_entry.get().strip().lstrip('/')if not self.validate_ip(ip_str):raise ValueError("无效的IP地址格式")# 获取网络类别ip_class = self.get_ip_class(ip_str)ip_int = self.ip_to_int(ip_str)mask_int, cidr = self.parse_mask(mask_str, ip_int)subnet_mask = self.int_to_ip(mask_int)network_int = ip_int & mask_intbroadcast_int = network_int | (~mask_int & 0xFFFFFFFF)hosts_count = max(broadcast_int - network_int - 1, 0)# 更新结果self.result_网络地址.config(text=self.int_to_ip(network_int))self.result_广播地址.config(text=self.int_to_ip(broadcast_int))self.result_可用IP数.config(text=f"{hosts_count} 个")self.result_CIDR表示.config(text=f"/{cidr}")self.result_子网掩码.config(text=subnet_mask)self.result_IP版本.config(text="IPv4")self.result_网络类别.config(text=ip_class) # 显示网络类别if hosts_count > 0:first_ip = self.int_to_ip(network_int + 1)last_ip = self.int_to_ip(broadcast_int - 1)self.result_可用IP范围.config(text=f"{first_ip} - {last_ip}")else:self.result_可用IP范围.config(text="无可用IP")except Exception as e:messagebox.showerror("错误", str(e))def clear_inputs(self):"""清空所有输入框内容"""self.ip_entry.delete(0, tk.END)self.mask_entry.delete(0, tk.END)# 清空结果显示result_fields = ["网络地址", "广播地址", "可用IP数","可用IP范围", "CIDR表示", "子网掩码","IP版本", "网络类别" # 新增字段]for field in result_fields:getattr(self, f"result_{field}").config(text="")def copy_results(self):"""将计算结果复制到剪贴板"""try:results = ["=== 子网计算器结果 ===",f"IP地址:{self.ip_entry.get()}",f"子网掩码:{self.result_子网掩码.cget('text')}",f"CIDR表示:{self.result_CIDR表示.cget('text')}",f"网络地址:{self.result_网络地址.cget('text')}",f"广播地址:{self.result_广播地址.cget('text')}",f"可用IP数:{self.result_可用IP数.cget('text')}",f"可用IP范围:{self.result_可用IP范围.cget('text')}",f"IP版本:{self.result_IP版本.cget('text')}",f"网络类别:{self.result_网络类别.cget('text')}", # 新增行"=" * 30]# 拼接结果并复制到剪贴板self.clipboard_clear()self.clipboard_append('\n'.join(results))messagebox.showinfo("复制成功", "结果已复制到剪贴板")except Exception as e:messagebox.showerror("复制失败", str(e))def save_current_result(self):"""保存当前计算结果"""try:# 收集当前结果result_data = {"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),"ip_address": self.ip_entry.get(),"subnet_mask": self.result_子网掩码.cget("text"),"cidr": self.result_CIDR表示.cget("text"),"network": self.result_网络地址.cget("text"),"broadcast": self.result_广播地址.cget("text"),"ip_range": self.result_可用IP范围.cget("text"),"hosts": self.result_可用IP数.cget("text"),"ip_class": self.result_网络类别.cget("text") # 新增字段}# 弹出保存对话框file_path = filedialog.asksaveasfilename(defaultextension=".csv",filetypes=[("CSV文件", "*.csv"), ("文本文件", "*.txt"), ("所有文件", "*.*")],title="保存计算结果")if file_path:# 写入文件with open(file_path, 'a', newline='', encoding='utf-8') as f:writer = csv.writer(f)if f.tell() == 0: # 如果是新文件,写入标题writer.writerow(["时间", "IP地址", "子网掩码", "CIDR","网络地址", "广播地址", "可用IP范围","主机数量", "网络类别"]) # 新增列writer.writerow([result_data["timestamp"],result_data["ip_address"],result_data["subnet_mask"],result_data["cidr"],result_data["network"],result_data["broadcast"],result_data["ip_range"],result_data["hosts"],result_data["ip_class"] # 新增数据])messagebox.showinfo("保存成功", f"结果已保存到:\n{file_path}")# 添加到内存历史记录(最多保留5条)self.history.insert(0, result_data)if len(self.history) > 5:self.history.pop()except Exception as e:messagebox.showerror("保存失败", str(e))def show_history(self):"""显示历史记录窗口"""history_window = tk.Toplevel(self)history_window.title("历史记录")history_window.geometry("800x300")# 创建表格columns = ("时间", "IP地址", "子网掩码", "CIDR", "网络地址","广播地址", "可用IP范围", "主机数量", "网络类别") # 新增列tree = ttk.Treeview(history_window, columns=columns, show="headings")# 设置列宽col_widths = [120, 100, 100, 60, 100, 100, 150, 80, 100] # 新增列宽for col, width in zip(columns, col_widths):tree.heading(col, text=col)tree.column(col, width=width, anchor=tk.W)# 添加滚动条scrollbar = ttk.Scrollbar(history_window, orient=tk.VERTICAL, command=tree.yview)tree.configure(yscroll=scrollbar.set)# 布局tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)scrollbar.pack(side=tk.RIGHT, fill=tk.Y)# 填充数据for record in self.history:tree.insert("", tk.END, values=(record["timestamp"],record["ip_address"],record["subnet_mask"],record["cidr"],record["network"],record["broadcast"],record["ip_range"],record["hosts"],record["ip_class"] # 新增数据))def export_history(self):"""导出历史记录到文件"""try:if not self.history:messagebox.showwarning("导出失败", "没有可导出的历史记录")returnfile_path = filedialog.asksaveasfilename(defaultextension=".csv",filetypes=[("CSV文件", "*.csv"), ("所有文件", "*.*")],title="导出历史记录")if file_path:with open(file_path, 'w', newline='', encoding='utf-8') as f:writer = csv.writer(f)writer.writerow(["时间", "IP地址", "子网掩码", "CIDR","网络地址", "广播地址", "可用IP范围","主机数量", "网络类别"]) # 新增列for record in self.history:writer.writerow([record["timestamp"],record["ip_address"],record["subnet_mask"],record["cidr"],record["network"],record["broadcast"],record["ip_range"],record["hosts"],record["ip_class"] # 新增数据])messagebox.showinfo("导出成功", f"历史记录已导出到:\n{file_path}")except Exception as e:messagebox.showerror("导出失败", str(e))def parse_mask(self, mask_str, ip_int):"""处理子网掩码输入,返回掩码整数和CIDR"""if mask_str.isdigit() and 0 <= int(mask_str) <= 32: # CIDR表示cidr = int(mask_str)mask_int = (0xFFFFFFFF << (32 - cidr)) & 0xFFFFFFFFelif self.validate_mask(mask_str): # 子网掩码表示mask_int = self.ip_to_int(mask_str)cidr = bin(mask_int).count('1')else:raise ValueError("无效的子网掩码/CIDR")return mask_int, cidr@staticmethoddef validate_ip(ip_str):"""验证IPv4地址格式"""parts = ip_str.split('.')if len(parts) != 4:return Falsefor part in parts:if not part.isdigit() or not 0 <= int(part) <= 255:return Falsereturn Truedef validate_mask(self, mask_str):"""验证子网掩码有效性"""if not self.validate_ip(mask_str):return Falsemask_int = self.ip_to_int(mask_str)binary = bin(mask_int)[2:].zfill(32)if '0' in binary:return '1' not in binary[binary.find('0'):]return True@staticmethoddef ip_to_int(ip_str):"""将IPv4地址转换为32位整数"""return sum(int(part) << (24 - 8 * i) for i, part in enumerate(ip_str.split('.')))@staticmethoddef int_to_ip(ip_int):"""将32位整数转换为IPv4地址"""return '.'.join(str((ip_int >> (24 - 8 * i)) & 0xFF) for i in range(4))if __name__ == "__main__":app = SubnetCalculatorApp()app.mainloop()"""主要功能说明:核心功能:支持IP地址和子网掩码(或CIDR)输入计算网络地址、广播地址、可用IP范围等信息支持IPv4地址格式验证新增功能:网络类别显示:自动判断并显示IP地址类别(A/B/C/D/E类,区分公网/私有地址)复制结果:将计算结果复制到剪贴板保存结果:将当前计算结果保存到文件(CSV或文本格式)历史记录:自动保存最近5条计算记录导出历史记录:将历史记录导出为CSV文件查看历史记录:以表格形式显示历史记录清除输入:一键清空输入框和计算结果使用示例:输入IP地址和子网掩码(或CIDR):IP地址:192.168.1.100子网掩码/CIDR:24 或 255.255.255.0点击“计算”按钮,显示结果:网络地址:192.168.1.0广播地址:192.168.1.255可用IP数:254 个可用IP范围:192.168.1.1 - 192.168.1.254CIDR表示:/24子网掩码:255.255.255.0IP版本:IPv4网络类别:C类(私有地址)使用其他功能:复制结果:将上述结果复制到剪贴板保存结果:将当前结果保存到文件清除输入:清空所有输入和结果查看历史记录:查看最近5条计算记录导出历史记录:将历史记录导出为CSV文件"""相关文章:
【子网掩码计算器:Python + Tkinter 实现】
子网掩码计算器:Python Tkinter 实现 引言代码功能概述代码实现思路1. 界面设计2. 功能实现3. 事件处理 子网掩码计算器实现步骤1. 导入必要的库2. 定义主窗口类 SubnetCalculatorApp3. 创建菜单栏4. 创建界面组件5. 判断 IP 地址类别6. 计算子网信息7. 其他功能函…...
《解锁HarmonyOS NEXT高阶玩法:艺术图像识别功能开发全攻略》
在当今数字化时代,AI技术不断拓展其应用边界,为各行业带来前所未有的变革。在艺术领域,AI图像识别技术能够帮助艺术从业者、爱好者快速识别艺术品风格、作者,甚至挖掘艺术品背后的历史文化信息。本文将结合HarmonyOS NEXT API 12及…...
Spring Boot的启动流程
Spring Boot 的启动流程是一个复杂且有序的过程: 创建SpringApplication实例 — 调用run方法 — 启动完成(发布应用启动事件,配置环境,创建ApplicationContext,准备ApplicationContext,刷新ApplicationContext[【创建B…...
【通俗讲解电子电路】——从零开始理解生活中的电路(三)
实际应用案例:生活中的电子电路 ——拆解你身边的“隐形工程师” 1. 手电筒电路:最简单的直流系统 电路组成 电源:2节1.5V电池(串联3V)。 开关:按钮控制回路通断。 LED:发光二极管ÿ…...
TypeScript系列01-类型系统全解析
本文总结了 TypeScript 的类型系统基础,涵盖了: TypeScript 的价值:静态类型检查为 JavaScript 添加了类型安全保障基本类型系统:从原始类型到特殊类型(any、unknown、never)的完整介绍类型注解与推断&…...
ragflow-mysql 启动失败案例分析
一、问题描述 1.拉取RAGflow镜像失败 dependency failed to start: container ragflow-mysql is unhealthy2. 查询日志 docker logs ragflow-mysql显示 出现[rootlocalhost docker]# docker logs ragflow-mysql Fatal glibc error: CPU does not support x86-64-v2 Fatal …...
SslConnection::SslConnection()详解
一、🔍 SslConnection::SslConnection() 详解 这个构造函数的主要作用是: 创建 SSL 对象创建 BIO(I/O 缓冲区)初始化 SSL 服务器模式绑定回调函数(onRead() 处理接收数据) 📌 1. 初始化 SSL 相…...
unity lua属性绑定刷新
我们现在有一个 角色属性类叫heroModel,内容如下,当heroModel中的等级发生变化的时候,我们需要刷新界面显示等级信息,通常我们是在收到等级升级成功的协议的时候,发送一个事件,UI界面接受到这个事件的时候,刷新一下等级…...
Self-Pro: A Self-Prompt and Tuning Framework for Graph Neural Networks
Self-Pro: A Self-Prompt and Tuning Framework for Graph Neural Networks #paper/GFM/GNN-BASED# #paper/⭐⭐⭐# 注意:这篇文章是每个图一个GCN模型,而不是所有图一个GCN 模型 算是最早的涉及异配图的prompt了 贡献和动机: 非对…...
企业级-数据分类分级详细方案
一、方案背景 在数字化时代,数据成为企业和组织的核心资产。随着数据量的快速增长和数据应用场景的不断拓展,如何有效地管理和保护数据,确保数据的安全性、合规性和可用性,成为了亟待解决的问题。数据分类分级作为数据管理的基础工作,能够帮助企业清晰地了解自身的数据资…...
本地部署Qwen2.5-VL-7B-Instruct模型
本地部署Qwen2.5-VL-7B-Instruct模型 本地部署Permalink **创建环境** conda create -n qwenvl python3.11 -y# 报错: Solving environment: failedPackagesNotFoundError: The following packages are not available from current channels:# 处理: c…...
【前端】简单原生实例合集html,css,js
长期补充,建议关注收藏点赞。 目录 a标签设置不一样的花样(图片但不用img)侧边固定box分栏input各种类型iframe表单拖拽 a标签设置不一样的花样(图片但不用img) a标签里面不用嵌套img,直接设置为其bg-img即可 <!DOCTYPE html…...
【Spring】配置文件的使用
在Spring框架中,application.properties(或application.yml)文件用于配置Spring应用程序的各种属性。我们可以通过多种方式来使用这些配置,包括使用Value和ConfigurationProperties注解来绑定配置到Java对象。 下面是对不同配置类…...
MOM成功实施分享(七)电力电容制造MOM工艺分析与解决方案(第一部分)
声明:文章仅用于交流学习,不用于商业项目实施,图片来源于网络,如有侵犯权利,请联系作者及时删除。 本方案旨在对电力电容(PEC和PQM型号)制造工艺深度分析,结合管理要求设计MOM相关功…...
计算机毕业设计SpringBoot+Vue.js航空机票预定系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Python 爬取唐诗宋词三百首
你可以使用 requests 和 BeautifulSoup 来爬取《唐诗三百首》和《宋词三百首》的数据。以下是一个基本的 Python 爬虫示例,它从 中华诗词网 或类似的网站获取数据并保存为 JSON 文件。 import requests from bs4 import BeautifulSoup import json import time# 爬取…...
【二.提示词工程与实战应用篇】【3.Prompt调优:让AI更懂你的需求】
最近老张在朋友圈秀出用AI生成的国风水墨画,隔壁王姐用AI写了份惊艳全场的年终总结,就连楼下小卖部老板都在用AI生成营销文案。你看着自己跟AI对话时满屏的"我不太明白您的意思",是不是怀疑自己买了台假电脑?别慌,这可能是你的打开方式不对。今天咱们就聊聊这个…...
商城源码的框架
商城源码的框架通常是基于某种Web开发框架或者电子商务平台来构建的。以下是一些常见的商城源码框架: WooCommerce:基于WordPress的电子商务插件,适用于小型到中型的在线商店。 Magento:一个功能强大和灵活的开源电子商务平台&am…...
WordPress如何防Webshell、防篡改、防劫持,提升WP漏洞防护能力
WordPress是一款世界知名的CMS系统,不仅可以创建博客网站,还可以用于建设企业网站、下载网站、商城等各类网站。功能非常强大、结构科学合理,深受广大用户喜欢。 虽然WordPress非常优秀,但是为了保障网站安全,我们还是…...
Android Flow 示例
在Android开发的世界里,处理异步数据流一直是一个挑战。随着Kotlin的流行,Flow作为Kotlin协程库的一部分,为开发者提供了一种全新的方式来处理这些问题。今天,我将深入探讨Flow的设计理念,并通过具体的例子展示如何在实…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
