基于python开发的IP修改工具

news2024/12/23 0:15:11

工作中调试设备需要经常修改电脑IP,非常麻烦,这里使用Python+tkinter做了一个IP修改工具
在这里插入图片描述

说明:

  • 1.启动程序读取config.json文件
  • 2.如果没有该文件则创建,写入当前网卡信息
  • 3.通过配置信息进行网卡状态修改
  • 4.更新文件状态,删除或修改当前config.json即可

打包指令

pyinstaller -F -w --uac-admin -i .\img\network_web_icon.ico -n IPTool .\setip_ui.py

项目 Github地址

项目代码

# -*- coding: utf-8 -*-
import tkinter as tk
from tkinter import messagebox
from tkinter import ttk
import subprocess
import re
import os
import json


class NetAdapter:
    def __init__(self, lines):
        self.EnableDHCP = '是' in lines[0]
        self.IPAddr = lines[1].split(':')[1].strip()
        input_string = lines[2]
        pattern = r'掩码 (\d+\.\d+\.\d+\.\d+)'
        match = re.search(pattern, input_string)
        self.Mask = match.group(1)
        # 接口 "net1" 的配置
        # DHCP 已启用:                          是
        # IP 地址:                           192.168.1.3
        # 子网前缀:                        192.168.1.0/24 (掩码 255.255.255.0)
        # 默认网关:                         192.168.1.1
        # 网关跃点数:                       0
        # InterfaceMetric:                      35

    def EnableDHCPStr(self):
        return '动态IP' if self.EnableDHCP else '静态IP'


class SetIPUI:
    def __init__(self, root):
        root.title("网卡设置工具")
        self.setmid(root)

        tk.Label(root, text="网卡类型").grid(row=0, padx='2px', pady='3px')
        self.configDic = self.initConfig()

        self.cmb = ttk.Combobox(root)
        self.cmb.grid(row=0, column=1, columnspan=1, padx='2px', pady='3px')
        self.cmb['values'] = list(self.configDic.keys())
        self.cmb.bind("<<ComboboxSelected>>", self.getAdapterInfo)

        rowIndex = 1
        self.entry_vars = []
        for title in ['类型', 'ip', '子网掩码']:
            tk.Label(root, text=title).grid(row=rowIndex, column=0, padx='2px', pady='3px')
            entry_var = tk.StringVar()
            entry = tk.Entry(root, textvariable=entry_var)
            entry.grid(row=rowIndex, column=1, padx='2px', pady='3px')
            self.entry_vars.append(entry_var)
            rowIndex += 1

        tk.Button(root, text="动态ip", width=10, command=self.setDynamicIp).grid(row=rowIndex, column=0, columnspan=1,
                                                                                 sticky="w", padx=10, pady=5)
        tk.Button(root, text="静态ip", width=10, command=self.setStaticIp).grid(row=rowIndex, column=1, columnspan=1,
                                                                                sticky="e", padx=10, pady=5)

        text=tk.Text(root,height=20,width=40)
        text.grid(row=0,column=2,rowspan=rowIndex+1,columnspan=3,sticky="e", padx=10, pady=5)
        self.setExplain(text)

    def setExplain(self,text:tk.Text):
        context="说明:\n" \
                "1.启动程序读取config.json文件\n" \
                "2.如果没有该文件则创建,写入当前网卡信息\n" \
                "3.通过配置信息进行网卡状态修改\n" \
                "4.更新文件状态,删除或修改当前config.json即可"
        text.insert('1.0',context)
    def setmid(self,root):
        window_width = 580
        window_height = 280
        screen_width = root.winfo_screenwidth()
        screen_height = root.winfo_screenheight()
        x = (screen_width - window_width) // 2
        y = (screen_height - window_height) // 2
        root.geometry(f"{window_width}x{window_height}+{x}+{y}")

    def initConfig(self) -> dict:
        fn = 'config.json'
        if not os.path.exists(fn):
            self.createConfig()
        with open(fn, "r",encoding='utf-8') as json_file:
            data = json.load(json_file)
            return data

    def createConfig(self):
        names = self.getAllNames()
        data = {}
        for name in names:
            myAda = self.getAdapterInfoImpl(name)
            if myAda is None:
                continue
            data[name] = {'dhcp': myAda.EnableDHCP, 'ip': myAda.IPAddr, 'mask': myAda.Mask}
        # 写回JSON文件
        fn = 'config.json'
        with open(fn, "w",encoding='utf-8') as json_file:
            json.dump(data, json_file, indent=4,ensure_ascii=False)

    def getAllNames(self):
        command = "netsh interface show interface"
        output = subprocess.check_output(command, shell=True, text=True)
        adapters = []
        lines = output.splitlines()
        lines = [l for l in lines if "连接" in l]
        for line in lines:  # 从第四行开始解析
            parts = line.split('   ')
            if len(parts) > 1:
                adapter_name = parts[-1]
                adapters.append(adapter_name)
                print(adapter_name)
        return adapters

    def getAdapterInfo(self, event):
        key=self.cmb.get()
        adapter = self.configDic[key]
        dhcp=self.getAdapterInfoImpl(key).EnableDHCPStr()
        if adapter is None:
            messagebox.showerror("错误", f"{self.cmb.get()}未连接或未启用")
            return

        self.entry_vars[0].set(dhcp)
        self.entry_vars[1].set(adapter['ip'])
        self.entry_vars[2].set(adapter['mask'])

    def getAdapterInfoImpl(self, adapter):
        command = f"netsh interface ip show address \"{adapter}\""
        output = subprocess.check_output(command, shell=True, text=True)

        # 解析输出以获取 IP 地址状态
        lines = output.splitlines()
        if (len(lines) <= 5):
            return

        myAda = NetAdapter(lines[2:])
        return myAda

    def setDynamicIp(self):
        adapter = self.cmb.get()  # 网卡名称
        # 使用netsh设置为动态IP地址(DHCP)
        try:
            ipCmd = f"netsh interface ipv4 set address name=\"{adapter}\" source=dhcp"
            subprocess.run(ipCmd, shell=True, check=True, encoding='utf-8')
            subprocess.run(f"netsh interface ipv4 set dns name=\"{adapter}\" source=dhcp", shell=True, check=True,
                           encoding='utf-8')
            messagebox.showinfo("完成", "已设置为动态IP地址(DHCP)")
        except subprocess.CalledProcessError as err:
            messagebox.showerror("错误", err.output)

    def setStaticIp(self):
        interface_name = self.cmb.get()  # 网卡名称
        # 请根据你的网络配置进行适当的替换
        ip_address = self.entry_vars[1].get()
        subnet_mask = self.entry_vars[2].get()

        try:
            command = f"netsh interface ipv4 set address name=\"{interface_name}\" static {ip_address} {subnet_mask}"
            # 使用netsh设置静态IP地址
            subprocess.run(command, shell=True, check=True)
            messagebox.showinfo("完成", "已设置为静态IP地址")
        except subprocess.CalledProcessError as err:
            messagebox.showerror("错误", err.output)


if __name__ == '__main__':
    # pyinstaller -F -w --uac-admin -i .\img\network_web_icon.ico -n IPTool .\setip_ui.py
    root = tk.Tk()
    myUI = SetIPUI(root)
    root.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1113808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

贝叶斯网络:架构和工作解释

一、介绍 在当今快速发展的人工智能 &#xff08;AI&#xff09; 世界中&#xff0c;对可解释 AI 的需求变得比以往任何时候都更加重要。随着人工智能系统越来越多地融入我们日常生活的各个方面&#xff0c;了解这些系统如何做出决策并为其行为提供解释至关重要。贝叶斯网络是一…

Odoo自动编码 亲测

方案一&#xff1a;代码实现自动编号 优点&#xff1a;如果移植程序后&#xff0c;不需要重新配置 缺点&#xff1a;不方便 代码结构&#xff1a; 1、XML代码 a、建一个qhdata文件夹&#xff0c;新建一个xml文件qhdata/qh_sequence.xml <?xml version"1.0"…

如何开发出来一款解决抖音本地生活的软件营销工具?

一、智能剪辑、矩阵分发、无人直播、爆款文案于一体独立应用开发 抖去推----主要针对本地生活的----移动端(小程序软件系统&#xff0c;目前是全国源头独立开发)&#xff0c;开发功能大拆解分享&#xff0c;功能大拆解&#xff1a; 7大模型剪辑法&#xff08;数学阶乘&#x…

4、Kafka 消费者

5.1 Kafka 消费方式 5.2 Kafka 消费者工作流程 5.2.1 消费者总体工作流程 5.2.2 消费者组原理 Consumer Group&#xff08;CG&#xff09;&#xff1a;消费者组&#xff0c;由多个consumer组成。形成一个消费者组的条件&#xff0c;是所有消费者的groupid相同。 • 消费者组内…

docker运行redis镜像

很多项目会用到redis作为缓存用到项目中&#xff0c;鉴于刚了解过docker&#xff0c;今天这里用docker运行redis镜像&#xff0c;这样下载&#xff0c;安装运行&#xff0c;或者是使用后的删除都会干净&#xff0c;简单。 好了&#xff0c;第一步是先拉取镜像&#xff0c;使用d…

C++前缀和算法的应用:DI序列的有效排列的原理、源码及测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 给定一个长度为 n 的字符串 s &#xff0c;其中 s[i] 是: “D” 意味着减少&#xff0c;或者 “I” 意味着增加 有效排列 是对有 n 1 个在 [0, n] 范围内的整数…

短视频矩阵系统源码(搭建)

短视频矩阵源码的开发路径分享如下&#xff1a; 1、首先&#xff0c;确定项目需求和功能&#xff0c;包括用户上传、编辑、播放等。 2、其次&#xff0c;搭建开发环境&#xff0c;选择合适的开发工具和框架。 3、然后&#xff0c;进行项目架构设计和数据库设计&#xff0c;确…

正点原子嵌入式linux驱动开发——Linux内核定时器

定时器是最常用到的功能&#xff0c;一般用来完成定时功能&#xff0c;本章就来学习一下Linux内核提供的定时器API函数&#xff0c;通过这些定时器API函数可以完成很多要求定时的应用。 Linux内核也提供了短延时函数&#xff0c;比如微秒、纳秒、毫秒延时函数&#xff0c;本章就…

shell命令行参数

#!/bin/bash echo "Number of arguments: $#"echo "All arguments as a single string: $*"echo "All arguments as a single string: $0,$1,$2" for i in "$" doecho "这是第 $i 次循环" done

拭目以待!万博智云亮相2023长沙·中国1024程序员节

2023年10月23 - 25日&#xff0c;第四届“长沙中国 1024 程序员节”将在中国长沙盛大举行&#xff0c;万博智云 OneProCloud将以大会钻石合作伙伴身份重磅亮相&#xff0c;CEO Michael将发表主题演讲。这也是万博智云首次成为长沙中国 1024 程序员节合作伙伴。 1.主题演讲 万博…

设备健康管理系统PreMaint如何帮助制药企业符合GMP认证要求

在制药行业&#xff0c;确保药品的质量、安全性和有效性是至关重要的。为了满足这一需求&#xff0c;药品生产质量管理规范&#xff08;GMP&#xff09;被广泛采用作为制药企业达到国际质量标准的基础。然而&#xff0c;制药企业在追求GMP认证标准时面临着不少挑战。本文将探讨…

高数二阶导数例子

例子&#xff1a; 当 x 0 x 0 x0时 f(x) 1&#xff0c;当 x ≠ 0 x \ne 0 x0时&#xff0c; f ( x ) sin ⁡ x x f(x) \frac{\sin x}{x} f(x)xsinx​, 求f’(x)。 解&#xff1a; 二阶导数是导数的导数&#xff0c;按照定义为&#xff1a; f ′ ′ ( x ) lim ⁡ x →…

【Java基础】JDK下载安装及环境配置完整教程

文章目录 1.jdk的下载2.安装jdk3.配置jdk的环境变量4.验证jdk配置环境变量是否配置成功5.配置环境变量的作用JAVA_HOMEPathCLASSPATH 1.jdk的下载 下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8-windows 注&#xff1a;此处下载需要oracle账…

带声学释放器的近海海底潜标的回收记录

我们主要在大洋调查中使用带声学释放器的海底潜标&#xff0c;在近岸海域很少这样做&#xff0c;因为近岸海域拖网作业较多&#xff0c;海底潜标很容易被渔网拖走或移位。前段时间&#xff0c;我们在近海也使用了这种方式&#xff0c;主要考虑到测区水深较深&#xff0c;即使是…

分析并实现Android中的MVC、MVP架构模式

架构是什么 架构是为了解决特定的问题而提出来的&#xff0c;而且它还有特定的规则&#xff0c;能够把整个应用的整体进行角色的划分。并且他还能够约定角色之间的联系沟通机制。 所以学习架构要带着以下三个问题去理解&#xff1a; 。架构解决了什么问题&#xff1f; 。架…

MobaXtem通过SSH远程登录ubuntu系统

工具&#xff1a;一个装windows10的笔记本电脑工控机路由器&#xff0c;工控机中安装的ubuntu16&#xff0c;通过网线和路由器相连。电脑连接路由器的wifi&#xff0c;就可以和工控机处于同一个局域网环境中&#xff0c;记得要修改电脑和工控机在同一个网段。 一、在ubuntu上安…

麒麟系统开发笔记(十三):在国产麒麟系统上编译OSG库、搭建基础开发环境和移植测试Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/133943583 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

mybatis自定义类型控制器(TypeHandler)处理将字符串处理为集合

1. 问题&#xff1a; 假设这么一个场景 localurl里面的值大概这样&#xff1a;dwad21.jpg,dwad22.jpg,dwad.23.jpg 是一个字符串 如果我在sql表中有一个字段&#xff08;local_url&#xff09;是本地图片资源的多个url字符串拼接值。我想在java后端中不进行额外的转换就取值加…

华硕灵耀X双屏pro(UX8402Z)原装Windows11系统恢复安装方法及其教程

华硕灵耀X双屏pro&#xff08;UX8402Z&#xff09;原装Windows11系统恢复安装方法及其教程 第一步&#xff1a;自备原装系统swm/esd/wim/iso等用PE安装还原的系统文件&#xff0c;或者拥有或者售后zip工厂恢复安装包&#xff08;6个底包&#xff1a;EDN.KIT.OFS.HDI.SWP.TLK&a…

【LeetCode:86. 分隔链表 | 链表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…