【子網掩碼計算器: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_ipvalidate_mask 來驗證 IP 地址和子網掩碼的格式是否正確。
  • 子網計算
    • 編寫函數 ip_to_intint_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 地址分類的方法。希望這篇博客對你有所幫助,如果你有任何問題或建議,歡迎在評論區留言。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896649.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896649.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896649.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【練習】【貪心】力扣1005. K 次取反后最大化的數組和

題目 1005 K 次取反后最大化的數組和 給你一個整數數組 nums 和一個整數 k &#xff0c;按以下方法修改該數組&#xff1a; 選擇某個下標 i 并將 nums[i] 替換為 -nums[i] 。 重復這個過程恰好 k 次。可以多次選擇同一個下標 i 。 以這種方式修改數組后&#xff0c;返回數組 可…

3dsmax中使用python創建PBR材質并掛接貼圖

前言 筆者處理模型時下載到一個pbr材質庫貼圖包&#xff0c;手動每次創建材質過于麻煩&#xff0c;因此計劃使用自動化腳本根據貼圖名自動創建材質。 3dsmax的原本腳本使用的是maxscript&#xff0c;語法有點奇怪懶得學&#xff0c;發現也支持使用python編寫腳本&#…

Metal學習筆記九:光照基礎

光和陰影是使場景流行的重要要求。通過一些著色器藝術&#xff0c;您可以突出重要的對象、描述天氣和一天中的時間并設置場景的氣氛。即使您的場景由卡通對象組成&#xff0c;如果您沒有正確地照亮它們&#xff0c;場景也會變得平淡無奇。 最簡單的光照方法之一是 Phong 反射模…

JAVA學習筆記038——bean的概念和常見注解標注

什么是bean? Bean 就是 被 Spring 管理的對象&#xff0c;就像工廠流水線上生產的“標準產品”。這些對象不是你自己 new 出來的&#xff0c;而是由 Spring 容器&#xff08;一個超級工廠&#xff09;幫你創建、組裝、管理。 由 Component、Service、Controller 等注解標記的…

start DL from stratch (2)!!!

start DL from stratch &#xff08;2&#xff09;!!! 一、CPU and GPUcpuGPU安培架構愛達洛夫萊斯架構 二、使用conda創建一個新的虛擬環境三、autodl操作先知Linux復習目錄文件和數據上傳對于整個鏡像的操作守護進程Tips 四、autodl租用創建實例<big>沒有所需要的版本的…

機器學習:線性回歸,梯度下降

線性回歸模型 (Linear Regression Model) 梯度下降算法 (Gradient Descent Algorithm) 的數學公式

論文筆記-NeurIPS2017-DropoutNet

論文筆記-NeurIPS2017-DropoutNet: Addressing Cold Start in Recommender Systems DropoutNet&#xff1a;解決推薦系統中的冷啟動問題摘要1.引言2.前言3.方法3.1模型架構3.2冷啟動訓練3.3推薦 4.實驗4.1實驗設置4.2在CiteULike上的實驗結果4.2.1 Dropout率的影響4.2.2 實驗結…

nvm的學習

學習 nvm&#xff08;Node Version Manager&#xff09; 是掌握 Node.js 開發的關鍵技能之一。以下是系統的學習路徑和實戰指南&#xff0c;涵蓋從基礎到進階的內容&#xff1a; 一、基礎入門 1. nvm 的核心作用 多版本共存&#xff1a;安裝和管理多個 Node.js 版本&#xff…

GPT-4.5實際性能評測:實際探索

摘要 經過數萬輪嚴格測試&#xff0c;GPT-4.5的性能并未超越其前代產品GPT-4。此前發布的《GPT-4.5 一手實測&#xff1a;垃圾》一文中存在不準確描述&#xff0c;在此向讀者致歉。盡管GPT-4.5在價格上有所提升且響應速度較慢&#xff0c;但測試結果顯示其模型素質并未達到預期…

從UNIX到Linux:操作系統進化史與開源革命

從UNIX到Linux&#xff1a;操作系統進化史與開源革命 一、操作系統&#xff1a;數字世界的基石 1.1 什么是操作系統&#xff1f; 操作系統&#xff08;OS&#xff09;是計算機系統的核心管理者&#xff0c;承擔著三大核心使命&#xff1a; 硬件指揮官&#xff1a;直接管理C…

如何修改安全帽/反光衣檢測AI邊緣計算智能分析網關V4的IP地址?

TSINGSEE青犀推出的智能分析網關V4&#xff0c;是一款集成了BM1684芯片的高性能AI邊緣計算智能硬件。其內置的高性能8核ARM A53處理器&#xff0c;主頻可高達2.3GHz&#xff0c;INT8峰值算力更是達到了驚人的17.6Tops。此外&#xff0c;該硬件還預裝了近40種AI算法模型&#xf…

【全棧開發】----Mysql基本配置與使用

本篇是在已下載Mysql的情況下進行的&#xff0c;若還未下載或未創建Mysql服務&#xff0c;請轉到這篇: 2024 年 MySQL 8.0.40 安裝配置、Workbench漢化教程最簡易&#xff08;保姆級&#xff09;_mysql8.0.40下載安裝教程-CSDN博客 本文對于mysql的操作均使用控制臺sql原生代碼…

C++ primer plus 第四節 復合類型

本章內容包括: ? 創建和使用數組 ? 創建和使用 c-風格字符串 ? 創建和使用 string 類字符串 ? 使用方法getline( )和 get( )讀取字符串 ? 混合輸入字符串和數字 ? 創建和使用結構 ? 創建和使用共用休 ? 創建和使用枚舉 ? 創建和使用指針 ? 使用 new和delete 管理動態…

Java中的泛型類 --為集合的學習做準備

學習目標 ● 掌握在集合中正確使用泛型 ● 了解泛型類、泛型接口、泛型方法 ● 了解泛型上下限 ● 了解基本的使用場景 1.有關泛型 1.1泛型的概念 泛型&#xff08;Generics&#xff09;是Java中引入的參數化類型機制&#xff0c;允許在定義類、接口或方法時使用類型參數&a…

VUE3+Vite使用TailwindCSS【若依前后端分離框架】

參考&#xff1a;https://tailwind.nodejs.cn/docs/guides/vite#vue 和 https://blog.csdn.net/hjl_and_djj/article/details/144694485依次運行命令&#xff1a; cnpm install -D tailwindcss3.4.17 postcss autoprefixernpx tailwindcss init -p修改配置文件tailwind.config.…

FFmpeg入門:最簡單的音頻播放器

FFmpeg入門&#xff1a;最簡單的音頻播放器 歡迎大家來到FFmpeg入門的第二章&#xff0c;今天只做一個最簡單的FFmpeg音頻播放器&#xff1b;同樣&#xff0c;話不多說&#xff0c;先上流程圖 流程圖 以上流程和視頻播放器的解碼過程基本上是一致的&#xff1b; 不同點在于 S…

在Ubuntu下,源碼編譯安裝Python

在Ubuntu下&#xff0c;源碼編譯安裝Python 知識點 知識點1&#xff1a;在 Linux 系統里&#xff0c;/usr 目錄通常用于存放一些共享的、只讀的程序和數據&#xff0c;是系統安裝軟件的一個重要位置。而 /usr/src 目錄一般是用來存放系統源代碼以及一些軟件包的源代碼的地方 …

《每天讀一個JDK源碼》之HashMap解讀

&#x1f4cc;《每天讀一個JDK源碼》之HashMap解讀 &#x1f517;源碼定位&#xff1a;java.util.HashMap&#xff08;建議IDE對照閱讀&#xff09; 今天我們來破解Java集合框架中最精妙的藝術品——HashMap&#xff01;它不僅是面試必考題&#xff08;出現率99%&#xff09;&…

【Java項目】基于SpringBoot的Java學習平臺

【Java項目】基于SpringBoot的Java學習平臺 技術簡介&#xff1a;采用Java技術、SpringBoot框架、MySQL數據庫等實現。系統基于B/S架構&#xff0c;前端通過瀏覽器與后端數據庫進行信息交互&#xff0c;后端使用SpringBoot框架和MySQL數據庫進行數據處理和存儲&#xff0c;實現…

使用ChatGPT-Deep Reaserch兩步給出文獻綜述!

文獻綜述是學術論文寫作中不可或缺的一部分&#xff0c;它不僅是對已有研究的梳理和總結&#xff0c;更是為后續研究奠定理論基礎的關鍵步驟。通過文獻綜述研究者能夠全面了解當前研究領域的現狀、主要觀點和研究方法&#xff0c;從而找到自己研究的切入點和創新點。這一過程需…