吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1097|回复: 42
上一主题 下一主题
收起左侧

[Python 原创] 本机IP地址查看及获取,包括IPV6

  [复制链接]
跳转到指定楼层
楼主
lgk 发表于 2024-11-13 19:42 回帖奖励
本帖最后由 lgk 于 2024-11-13 19:44 编辑

自己借助于编程代码助手,用python写的一个获取本机IP地址的小程序,单文件,双击即可复制IP地址,不知道代码结构是否足够清晰,还请大佬们批评指正






[Python] 纯文本查看 复制代码
import tkinter as tk
from tkinter import ttk
import socket
import psutil
import pyperclip
import subprocess
from tkinter import messagebox


def get_network_info():
    """获取网络接口信息"""
    network_info = []
    addrs = psutil.net_if_addrs()
    net_stats = psutil.net_if_stats()
    seen_interfaces = set()

    for interface in addrs.keys():
        if net_stats[interface].isup and interface not in seen_interfaces:
            ipv4_address, mac_address = "Not Available", "Not Available"
            ipv6_addresses = []

            for addr in addrs[interface]:
                if addr.family == socket.AF_INET:
                    ipv4_address = addr.address
                elif addr.family == socket.AF_INET6:
                    if addr.address.startswith("fe80"):
                        ipv6_addresses.append(f"{addr.address} (内网可用)")
                    else:
                        ipv6_addresses.append(addr.address)
                elif addr.family == psutil.AF_LINK:
                    mac_address = addr.address

            # 将收集到的信息添加到列表中
            for ipv6_addr in ipv6_addresses:
                network_info.append([interface, ipv4_address, ipv6_addr, mac_address])
            seen_interfaces.add(interface)

    return network_info


def copy_selected_value(tree, item_id, column):
    """复制选中的值并弹出提示框"""
    value = tree.item(item_id, 'values')[tree['columns'].index(column)]

    if column == "IPv6":
        value = value.split(" (")[0]  # 去掉备注

    pyperclip.copy(value)
    messagebox.showinfo("提示", f"{column} '{value}' 复制成功!")


def ping_ip(ip_address):
    """在新CMD窗口中对指定IP进行ping操作"""
    try:
        subprocess.Popen(f"start cmd /k ping {ip_address}", shell=True)
    except Exception as e:
        messagebox.showerror("错误", f"无法 ping IP 地址: {e}")


def show_context_menu(event, tree):
    """显示右键上下文菜单"""
    selected_item = tree.selection()
    if selected_item:
        column_index = int(tree.identify_column(event.x).replace("#", "")) - 1
        ip_address = tree.item(selected_item[0], 'values')[column_index]

        context_menu = tk.Menu(root, tearoff=0)
        context_menu.add_command(label="Ping", command=lambda: ping_ip(ip_address))
        context_menu.post(event.x_root, event.y_root)


def on_tree_item_double_click(event, tree):
    """处理双击事件以复制值"""
    selected_item = tree.selection()[0]
    column = tree.identify_column(event.x)
    column_index = int(column.replace("#", "")) - 1
    copy_selected_value(tree, selected_item, tree['columns'][column_index])


def setup_treeview(frame):
    """设置树形视图及其样式"""
    columns = ("网络接口名称", "IPv4", "IPv6", "MAC")
    tree = ttk.Treeview(frame, columns=columns, show="headings")

    # 设置列标题和宽度
    for col in columns:
        tree.heading(col, text=col)
        tree.column(col, width=200 if col == "网络接口名称" else 300, anchor='center')

    style = ttk.Style()
    style.configure("Treeview", rowheight=25, fieldbackground="white", borderwidth=2, relief="solid")
    style.configure("Treeview.Heading", font=('Helvetica', 12, 'bold'), borderwidth=2, relief="solid")

    return tree


def show_network_info():
    global root  # 将root设置为全局变量
    root = tk.Tk()
    root.title("IP 地址查看器(双击复制)")

    frame = ttk.Frame(root)
    frame.pack(fill=tk.BOTH, expand=True)

    network_info = get_network_info()
    interface_tree = setup_treeview(frame)

    for info in network_info:
        interface_tree.insert("", tk.END, values=info)

    # 绑定事件
    interface_tree.bind("<Double-1>", lambda event: on_tree_item_double_click(event, interface_tree))
    interface_tree.bind("<Button-3>", lambda event: show_context_menu(event, interface_tree))

    scrollbar = ttk.Scrollbar(frame, orient=tk.VERTICAL, command=interface_tree.yview)
    interface_tree.configure(yscrollcommand=scrollbar.set)

    interface_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
    scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

    # 调整窗口大小以适应内容
    root.update_idletasks()
    row_count = len(network_info)
    root.minsize(root.winfo_width(), 25 * row_count + 100)

    root.geometry("")  # 根据内容动态调整窗口大小
    root.mainloop()


if __name__ == "__main__":
    show_network_info()




蓝奏云网盘(永久有效):https://lgkl.lanzout.com/i3yOp2ez2kdc
密码:2prj

免费评分

参与人数 5吾爱币 +3 热心值 +5 收起 理由
yanglinman + 1 谢谢@Thanks!
qiaoyong + 1 + 1 热心回复!
jiushiyaole + 1 + 1 谢谢@Thanks!
yikuaifangtang + 1 谢谢@Thanks!
aahinozzy + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
 楼主| lgk 发表于 2024-11-14 20:35 |楼主
xc4447 发表于 2024-11-13 22:15
这个跟命令行的那个获取内容是一样的吗。一些比较特殊的网桥(比如基于hyperv的wsl和wsa)可以获取到吗

跟命令行获取到的是一样的,虚拟网卡应该也是能够获取的,基于Hyper-V的没有测试过,不过VMware的都能获取到,大佬可以自行测试一下
推荐
BrutusScipio 发表于 2024-11-14 00:37
如果不是为了跨平台的话 Windows用C++ C# powershell都可以 单独查看没什么必要,加个修改还行,什么几个设置一键变更
沙发
ccipromise 发表于 2024-11-13 20:58
3#
opaomilk 发表于 2024-11-13 21:10
挺不错的,很棒
4#
huangdi956 发表于 2024-11-13 21:12
cmd也方便呀
5#
anorith 发表于 2024-11-13 21:20
感谢分享,这是很实用的工具
6#
kseleven 发表于 2024-11-13 21:56
非常棒的软件,请问是window还是linux系统适用呢?
7#
xc4447 发表于 2024-11-13 22:15
这个跟命令行的那个获取内容是一样的吗。一些比较特殊的网桥(比如基于hyperv的wsl和wsa)可以获取到吗
8#
xiaomaodu 发表于 2024-11-13 22:35
这不就是一个命令的事儿?????
9#
飘水 发表于 2024-11-14 00:12
体验一下,非常有效,如果再带上子网掩码、网关以及DNS就更好了
10#
riverskywrorld 发表于 2024-11-14 00:19
ipconfig /all也能看
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 12:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表