• Python学习(7)--获取windows本地网卡和地址信息(2)


    5 控件combobox

    也就是下拉框

    下拉框的主要用法就是:

    1. 创建下拉的内容
    2. 选定下拉内容

    由于combobox控件没有connand方法,所以在选定下拉内容时,使用虚拟事件"<>"。

    下面是一个简单的代码:

    这个代码最让我有用的是grid布局,可以让你在窗口上的控件有序排列。

    1. from tkinter import *
    2. from tkinter import ttk, tix, StringVar
    3. mywin = tix.Tk()
    4. lb_text = StringVar()
    5. mywin.geometry("600x200")
    6. lb1 = tix.Label(mywin, text='下拉框选项:')
    7. c_values=['下拉选项1', '下拉选项2', '下拉选项3', '下拉选项4']
    8. c_values.append('下拉选项5')
    9. cb1 = ttk.Combobox(mywin)
    10. cb1 = ttk.Combobox(mywin, values=c_values)
    11. #cb1['value'] = ['下拉选项1', '下拉选项2', '下拉选项3', '下拉选项4']
    12. #cb1['value'] = c_values
    13. cb1.current(0)
    14. lb_text.set(cb1.get())
    15. lb2 = tix.Label(mywin, textvariable=lb_text)
    16. #windows中控件的位置摆放
    17. '''grid布局'''
    18. #sticky N,S,W,E 表示 上,下,左,右
    19. lb1.grid(row=1, column=1, sticky='NW')
    20. cb1.grid(row=1, column=2, sticky='NW')
    21. lb2.grid(row=1, column=3, sticky='NW')
    22. '''pack布局'''
    23. #lb1.pack(pady=20)
    24. #lb1.pack(side = LEFT,ipadx = 0, pady=0 )
    25. #cb1.pack(side = LEFT,ipadx = 10, pady=20 )
    26. #根据选择改变lb2的内容
    27. def myselection(self):
    28. lb_text.set(cb1.get())
    29. pass
    30. cb1.bind("<>", myselection)
    31. mywin.mainloop()

    运行结果:

    该代码一共创建了三个控件:1,左边的Lable作为内容提示;2,中间的combobox控件;3,右边Lable,选中combobox内容后的显示

    6 dict(数据字典)类型

    字典是另一种可变容器模型,且可存储任意类型对象。

    字典的每个键值 key:value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示:

    d = {key1 : value1, key2 : value2 }

    注意:dict 作为 Python 的关键字和内置函数,变量名不建议命名为 dict

    键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一。

    为啥要说这个类型呢?根据我目前看过的Python代码,有很多函数返回的都是dict类型。所以需要对这个类型多多学习和理解。请参考Python 字典(Dictionary) | 菜鸟教程

    7 获取本机网卡信息

    7.1 使用re模块对命令行解析获取

    用到的内容:

    1. subpross.Popen()执行ipconfig命令
    2. 对ipconfig得到的字符串进行正则匹配拿到想要的结果
    3. 分两层解析:1,网卡名称;2,网卡下的具体信息
    1. import subprocess
    2. import re
    3. # 执行windows命令
    4. def exec_command(commands):
    5. p = subprocess.Popen(commands, shell=True, stdout=subprocess.PIPE, universal_newlines=True)
    6. p.wait()
    7. return p.stdout.readlines()
    8. def get_ipinfo():
    9. res = exec_command('ipconfig')
    10. net_card_data = list()
    11. temp_dict = dict(flag=True)
    12. gateway_error = False
    13. for x in res:
    14. #print(x)
    15. # 匹配IP正则
    16. pattern = re.compile(r'(.*):(.*)|(((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3})')
    17. # 测试发现有的网关会默认在下一行,情况见说明一,所以这边检查到默认网关,发现没有匹配到,则从下一行找
    18. if gateway_error:
    19. temp_dict['gateway1'] = pattern.search(x).group()
    20. gateway_error = False
    21. #print("当前网卡 %s 获取第二行网关信息 %s" % (temp_dict['card_name'], temp_dict['gateway1']))
    22. continue
    23. # 如果发现新的适配器,则重置上一个网卡是否可用的状态
    24. if "适配器" in x:
    25. temp_dict = dict(flag=True)
    26. temp_dict['card_name'] = x.split(" ", 1)[1][:-1]
    27. #print("当前网卡 %s" % (temp_dict['card_name']))
    28. continue
    29. if "IPv4 地址" in x:
    30. temp_dict['ip'] = pattern.search(x).group(2)
    31. #print("当前网卡 %s 获取IP信息 %s" % (temp_dict['card_name'], temp_dict['ip']))
    32. continue
    33. elif "子网掩码" in x:
    34. temp_dict['mask'] = pattern.search(x).group(2)
    35. #print("当前网卡 %s 获取子网掩码信息 %s" % (temp_dict['card_name'], temp_dict['mask']))
    36. continue
    37. # 测试发现有的网关会默认在下一行,情况见说明一,所以这边做了异常处理
    38. elif "默认网关" in x:
    39. try:
    40. temp_dict['gateway1'] = pattern.search(x).group(2)
    41. #print("当前网卡 %s 获取默认网关信息 %s" % (temp_dict['card_name'], temp_dict['gateway1']))
    42. except:
    43. gateway_error = True
    44. #print("当前网卡 %s 解析当前行默认网关信息错误" % (temp_dict['card_name']))
    45. finally:
    46. pass
    47. #print('未找到信息2')
    48. # 如果检查到网关,代表当前适配器信息已经获取完毕 重置网关状态与适配器信息字典
    49. if temp_dict.get("gateway1"):
    50. net_card_data.append(temp_dict)
    51. #print("当前网卡 %s 当前适配器信息获取完毕 %s \n\n" % (temp_dict['card_name'], temp_dict))
    52. temp_dict = dict(flag=True)
    53. continue
    54. # 发现媒体已断开则更改当前适配器状态
    55. elif "媒体已断开" in x:
    56. #print("当前网卡 %s 已断开 跳过\n\n" % (temp_dict['card_name']))
    57. temp_dict['flag'] = False
    58. continue
    59. # 判断媒体状态正常,IP、子网掩码、网关都正常后,保持起来
    60. if temp_dict.get("flag") and temp_dict.get("ip") and temp_dict.get("mask") and temp_dict.get("gateway1"):
    61. #print("当前网卡 %s 当前适配器信息获取完毕 %s \n\n" % (temp_dict['card_name'], temp_dict))
    62. net_card_data.append(temp_dict)
    63. # 重置网关状态与适配器信息字典
    64. temp_dict = dict(flag=True)
    65. continue
    66. pass
    67. for i in net_card_data:
    68. print("%s:\nip=%s,mask=%s" % (i.get("card_name"), i.get('ip'), i.get('mask')))
    69. if __name__ == '__main__':
    70. get_ipinfo()

    结果:

     

    7.2 使用winreg模快和netiface模块获取

    注意两点

    1. 使用winreg取出网卡信息
    2. 在取该网卡的循环里使用netiface取ip,当然可以取别的我没写。可以参考前面说的neiface用法
    1. #!/usr/bin/python
    2. # -*- coding: UTF-8 -*-
    3. # 文件名:getwindev.py
    4. import netifaces
    5. from netifaces import interfaces, ifaddresses, AF_INET
    6. import winreg as wr
    7. def get_ipinfo():
    8. #获取所有网络接口卡的键值
    9. #id = interfaces()
    10. #存放网卡键值与键值名称的字典
    11. key_name = {}
    12. try:
    13. #建立链接注册表,"HKEY_LOCAL_MACHINE",None表示本地计算机
    14. reg = wr.ConnectRegistry(None,wr.HKEY_LOCAL_MACHINE)
    15. # 打开r'SYSTEM\CurrentControlSet\Control\Network\{4d36e972-e325-11ce-bfc1-08002be10318}',固定的
    16. reg_key = wr.OpenKey(reg , r'SYSTEM\CurrentControlSet\Control\Network\{4d36e972-e325-11ce-bfc1-08002be10318}')
    17. except :
    18. return ('路径出错或者其他问题,请仔细检查')
    19. for ifaceName in interfaces():
    20. try:
    21. #尝试读取每一个网卡键值下对应的Name
    22. reg_subkey = wr.OpenKey(reg_key , ifaceName + r'\Connection')
    23. #如果存在Name,写入key_name字典
    24. #print(wr.QueryValueEx(reg_subkey , 'Name')[0])
    25. addresses = [i['addr'] for i in ifaddresses(ifaceName).setdefault(AF_INET, [{'addr':'No IP addr'}] )]
    26. key_name[wr.QueryValueEx(reg_subkey , 'Name')[0]] = addresses[0]
    27. except FileNotFoundError:
    28. #print('未找到信息')
    29. pass
    30. return key_name
    31. if __name__ == '__main__':
    32. print(get_ipinfo())

    结果:

     

  • 相关阅读:
    Node开发后台API接口项目
    【剑指Offer | C++ 】面试题6:替换空格
    fatal: Authentication failed for ‘https://github.com
    一个启动U盘装多系统引导,无需反复格式化,ISO/WIM等文件拷贝到U盘即可启动
    JavaSE运算符
    外贸网站优化常用流程和一些常识
    嵌入式Linux_驱动开发:offset宏和container_of宏
    C#多线程之(Thread)详解与示例
    Vue基础(十)——项目部署
    行情分析——加密货币市场大盘走势(11.15)
  • 原文地址:https://blog.csdn.net/monkeyzh123/article/details/126347122