0

感谢您花时间看我的问题。

我正在学习 wxPython 的诀窍,我想采用一个输出到终端的工作程序并对其进行整容。使用 Scapy,我正在嗅探我的无线接口以获取探测请求/探测响应,它按预期工作。但是,我不想输出到终端窗口,而是将其输出到我的新 GUI 中的 StaticText (tc2) 框架。

到目前为止,我一直在使用教程来创建我的 GUI,但是,当前代码仍然在加载我的 GUI 之前将 Scapy 输出到终端,因为嗅探函数一直运行到它被用户杀死,因此从未真正加载 GUI。我已经尝试将嗅探功能放在 wx.StaticText 行中,但让它在那里打印并不高兴。

我的 Scapy 程序和 GUI 程序都可以独立工作,但是它们不能同时工作。我的目标是将返回值显示到 StaticText 框。以下是与我的问题相关的一小部分代码。

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()
4

1 回答 1

1

在 wxPython 应用程序加载之前,您不想开始嗅探。因此,您要么希望在按钮或菜单事件处理程序中开始嗅探,要么可以使用 wx.CallLater 在应用程序加载后通过将 CallLater 命令放在 wx 代码的 init 末尾来开始执行。

当我重定向 ping 命令(除其他外)时,我做了类似的事情。你可以看看我关于这个主题的教程。如果您需要更多有关重定向标准输出的背景知识,请参阅此处

我在这里的另一个答案中涵盖了这个问题的基本要点:将命令提示符输出重定向到 python 生成的窗口

基本上你想使用这样的东西重定向文本:

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() 也很重要。Yield 允许文本“打印”(即重定向)到标准输出。没有它,在命令完成之前文本不会显示。我希望这一切都说得通。

如果您需要在单独的线程中运行它,这里有几个关于该主题的链接:

于 2013-03-25T17:45:36.820 回答