将Scapy输出打印到wxPython文本控制器
谢谢你抽出时间来看我的问题 我正在学习wxPython的诀窍,我想做一个输出到终端的工作程序,并对其进行整容。使用Scapy,我可以嗅探我的无线接口中的探测请求/探测响应,它可以按预期工作。但是,我不想输出到终端窗口,而是想将其输出到新GUI中的StaticText(tc2)框架 现在我已经使用了一个教程来创建我的GUI,但是,目前的代码仍然在加载我的GUI之前将Scapy输出到终端,因为sniff函数一直运行到被用户终止,因此从未真正加载GUI。我曾尝试将sniff函数放在wx.StaticText行中,但在那里打印它却没有什么乐趣 我的Scapy程序和GUI程序都可以独立工作,但是它们不能同时工作。我的目标是将返回值显示到StaticText框中。下面是与我的问题相关的代码的一小部分将Scapy输出打印到wxPython文本控制器,python,wxpython,scapy,Python,Wxpython,Scapy,谢谢你抽出时间来看我的问题 我正在学习wxPython的诀窍,我想做一个输出到终端的工作程序,并对其进行整容。使用Scapy,我可以嗅探我的无线接口中的探测请求/探测响应,它可以按预期工作。但是,我不想输出到终端窗口,而是想将其输出到新GUI中的StaticText(tc2)框架 现在我已经使用了一个教程来创建我的GUI,但是,目前的代码仍然在加载我的GUI之前将Scapy输出到终端,因为sniff函数一直运行到被用户终止,因此从未真正加载GUI。我曾尝试将sniff函数放在wx.StaticT
tc2 = wx.TextCtrl(panel, wx.ID_ANY, size=(300,100), style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL)
btn1 = wx.Button(panel, label='Sniff', size=(70, 30))
self.Bind(wx.EVT_BUTTON, self.OnSniff, btn1)
redir=RedirectText(tc2)
sys.stdout=redir
def OnSniff(self,e):
sniff(iface="mon0",prn=packets,store=0)
def packets(p):
if p.haslayer(Dot11ProbeReq):
dstmac=p.addr1
mac=p.addr2
if p.info == "":
ssid="BROADCAST"
else:
ssid=p.info
print "%s is probing %s %s" % (mac,dstmac,ssid)
if p.haslayer(Dot11ProbeResp):
dstmac=p.addr1
bssid=p.addr2
ssid=p.info
print "%s (%s) Probe Response to %s" % (ssid,bssid,dstmac)
wx.Yield()
在wxPython应用程序加载之前,您不希望启动嗅探。因此,您可以在按钮或菜单事件处理程序中启动嗅探,也可以在应用程序加载后使用wx.CallLater启动执行,方法是将CallLater命令放在wx代码的init末尾 当我重定向ping命令时,我做了类似的事情。你可以看看我对这个问题的看法。如果需要有关重定向标准输出的更多背景信息,请参阅 我在这里的另一个回答中谈到了这件事的基本要点: 基本上,您希望使用如下方式重定向文本:
class RedirectText:
def __init__(self,aWxTextCtrl):
self.out=aWxTextCtrl
def write(self,string):
self.out.WriteText(string)
然后在我的ping示例中,我执行了以下操作:
def pingIP(self, ip):
proc = subprocess.Popen("ping %s" % ip, shell=True,
stdout=subprocess.PIPE)
print
while True:
line = proc.stdout.readline()
wx.Yield()
if line.strip() == "":
pass
else:
print line.strip()
if not line: break
proc.wait()
主要要看的是子流程调用中的stdout参数,wx.Yield()也很重要。产量允许文本“打印”(即重定向)到标准输出。没有它,文本在命令完成之前不会显示。我希望这一切都有意义
如果您需要在单独的线程中运行此功能,以下是有关该主题的两个链接: