Tkinter Combobox无法加载局域网获取的IP地址问题求助
解决Tkinter Combobox无法显示Scapy获取的局域网IP问题
问题描述
Linux环境下,通过Scapy可正常获取局域网IP并在控制台打印,但运行代码后Tkinter Combobox始终为空;即使直接指定IP段(如192.168.1.0/24),Combobox依然无法显示IP列表。核心需求是将Scapy获取的IP添加到Combobox中。
原代码:
from scapy.all import * import sys import os from tkinter import * from tkinter import ttk import subprocess class Uygulama(object): new_list1=None def __init__(self): self.araclar() #contain widgets and tools about windows self.refresh() #finding ip addresses in local network using scapy def refresh(self): self.new_list = [] # 此处用户补充修改为指定IP段,如"192.168.1.0/24" self.a, self.b = srp(Ether(dst="FF:FF:FF:FF:FF:FF") / ARP(pdst="192.168.1.0/24"), timeout=2, iface="eth0",retry=3) for self.snd, self.rcv in self.a: self.ip = self.rcv[ARP].psrc self.new_list.append(self.ip) self.new_list1 = self.new_list def araclar(self): self.ip_list1 = ttk.Combobox(width=27) self.ip_list1["values"] = self.new_list1 self.ip_list1.place(relx=0.05, rely=0.08) self.ip_list1.set("Victim IP Address") self.dugme4 = Button(text="Refresh IPS", command=self.refresh, fg="black", bg="blue", font="bold") self.dugme4.place(relx=0.40, rely=0.18) pencere = Tk() uyg = Uygulama() mainloop()
问题原因
- 初始化顺序问题:
araclar先执行时,new_list1为None,导致Combobox初始值为空;后续refresh更新了new_list1,但未同步更新Combobox的values属性。 - 未实时刷新控件:每次点击"Refresh IPS"获取新IP后,仅更新了变量
new_list1,没有将新IP列表赋值给Combobox,也未触发控件刷新。
解决方案
修改refresh函数,在获取IP列表后直接更新Combobox的values属性;同时优化初始化逻辑,确保首次IP能正确显示。
修改后的代码
from scapy.all import * import sys import os from tkinter import * from tkinter import ttk import subprocess class Uygulama(object): def __init__(self): self.araclar() # 创建界面控件 self.refresh() # 首次获取IP并更新Combobox def refresh(self): self.new_list = [] # 可根据实际网络修改IP段 self.a, self.b = srp(Ether(dst="FF:FF:FF:FF:FF:FF") / ARP(pdst="192.168.1.0/24"), timeout=2, iface="eth0", retry=3) for snd, rcv in self.a: ip = rcv[ARP].psrc self.new_list.append(ip) # 直接更新Combobox的选项列表 self.ip_list1["values"] = self.new_list # 可选:默认选中第一个IP # if self.new_list: # self.ip_list1.set(self.new_list[0]) def araclar(self): self.ip_list1 = ttk.Combobox(width=27) self.ip_list1.place(relx=0.05, rely=0.08) self.ip_list1.set("Victim IP Address") self.dugme4 = Button(text="Refresh IPS", command=self.refresh, fg="black", bg="blue", font="bold") self.dugme4.place(relx=0.40, rely=0.18) pencere = Tk() uyg = Uygulama() mainloop()
关键改动说明
- 移除冗余的
new_list1变量,直接操作Combobox的values属性,减少中间变量的干扰。 - 在
refresh函数末尾,将获取到的IP列表直接赋值给self.ip_list1["values"],确保每次刷新后Combobox实时更新。 - 调整初始化逻辑,先创建控件再调用
refresh,保证首次启动时Combobox能加载到IP列表。
内容的提问来源于stack exchange,提问作者user21109117
相关产品推荐
相关产品推荐

