如何将scapy扫描的MAC、IP地址输出到Tkinter GUI的listbox组件中
问题根因
ans.summary() 方法的默认行为是直接将结果输出到控制台,本身返回值为None,所以你赋值给display变量拿到的是空值,插入Listbox自然没有内容。
调整方案
直接遍历ans对象手动提取所需字段,再插入Listbox即可,有两种常用实现方式:
方式1:直接遍历提取字段
from scapy.layers.l2 import Ether, ARP # 你原有扫描逻辑拿到ans对象后,替换原来的ans.summary语句 for s, r in ans: # 格式和你之前用sprintf输出的效果完全一致 scan_result = f"{r[Ether].src} {r[ARP].psrc}" # 插入Listbox,传0表示插在列表头部,传END表示插在列表尾部 listbox.insert(0, scan_result)
方式2:复用原有sprintf写法收集结果
如果不想改动原有输出格式逻辑,可以把结果先收集到列表再批量插入:
result_buffer = [] # 把summary的打印内容全部存入缓存列表 ans.summary(lambda s, r: result_buffer.append(r.sprintf("%Ether.src% %ARP.psrc%"))) # 批量插入Listbox for item in result_buffer: listbox.insert(0, item)
额外注意事项
如果你的扫描逻辑是直接写在Tkinter主线程中执行的,扫描过程中会出现GUI界面无响应,建议把扫描逻辑放到子线程中运行,再通过Tkinter的after()方法回调更新Listbox,避免界面假死。
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

