2016-05-20 52 views
1

我用tkinter制作GUI,允许我点击一个按钮来运行端口扫描。我有一个端口扫描脚本可以正常工作,我已经设法通过GUI上的按钮打开端口扫描器,但是当我单独运行端口扫描器时,我收到了一个我没有收到的错误。Gui用按钮打开端口扫描器

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Users\Steve\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1550, in __call__ 
    return self.func(*args) 
    File "<string>", line 51, in Scan 
NameError: name 'IP_Input' is not defined 

我的代码:

class CallWrapper: 
    """Internal class. Stores function to call when some user 
    defined Tcl function is called e.g. after an event occurred.""" 
    def __init__(self, func, subst, widget): 
     """Store FUNC, SUBST and WIDGET as members.""" 
     self.func = func 
     self.subst = subst 
     self.widget = widget 

    def __call__(self, *args): 
     """Apply first function SUBST to arguments, than FUNC.""" 
     try: 
      if self.subst: 
       args = self.subst(*args) 
      return self.func(*args)   # THIS IS THE ERROR # 
     except SystemExit: 
      raise 
     except: 
      self.widget._report_exception() 


class XView: 
    """Mix-in class for querying and changing the horizontal position 
    of a widget's window.""" 

    def xview(self, *args): 
     """Query and change the horizontal position of the view.""" 
     res = self.tk.call(self._w, 'xview', *args) 

这是代码以下为第51行错误

def Scan(): 
    print ('Scan Called.') #Debugging 
    IP = str(IP_Input.get(0.0, tkinter.END)) #THIS IS ERROR LINE 51# 
    print ("IP #Debugging") 
    Start = int(PortS.get(0.0, tkinter.END)) 
    End = int(PortE.get(0.0, tkinter.END)) 
    TestSocket = socket.socket() 
    CurrentPort = Start 
    OpenPorts = 0 
    print ('Starting scan...') 
    HowFar = int(CurrentPort/End * 100) 
    ProgText = HowFar, r'%' 
    Label1.config(text=('Percentage Done:', ProgText)) 
+0

喜,欢呼声,我希望这会有所帮助: – lee

+0

IP_Input = tkinter.Text(WIN) IP_Input.pack(扩大= tkinter.YES,填写= tkinter.NONE) IP_Input.place_configure(宽度= 120,高度= 20) IP_Input.place_configure(X = 40,Y = 10) 打印( “IP_Input完成”) – lee

+0

这是我的基本GUI - http://pastebin.com/1qgWQ4EL ,这是端口扫描程序 - http://pastebin.com/df2QQr8A,但问题似乎与这_init_.py文件http://pastebin.com/j03AxHPN – lee

回答

1

问题是与你的exec声明。您正在打开名为port_scanner.py的其他.py文件,然后调用exec(open("./port scanner.py))

这只是不会工作。

为什么这不起作用:

当你exec(open("path to .py file").read()) EXEC当然这段代码执行的,但问题是,在这个文件中的全局变量不在范围之内。

因此,为了使这项工作(我不推荐),你就必须使用:

exec(open(path).read(), globals()) 

documentation

如果全局字典中不包含的值对于密钥builtins,对内置模块内置字典的引用插入该密钥下。通过这种方式,您可以在将它传递给exec()之前,将自己的builtins字典插入到全局变量中,从而控制可执行代码可用的内建函数。

如果你真的想用这种方式打电话给你的文件,那么你应该只使用os.system

替代做法:

你真的不需要打电话给你的文件这样。您现在有两个Tk()运行实例。如果您需要另一个窗口,则为此提供了一个小部件。它是Toplevel小部件。您可以重新构建代码,以便在按钮单击时创建包含端口扫描器应用程序的实例Toplevel。例如,使用Toplevel小部件创建您的端口扫描器应用程序(如果您愿意,可以在您的其他文件中),然后将“app”导入到您的文件中,然后点击按钮,使其初始化应用程序。

其他注意事项:

你调用一个while循环,如果运行(任何时间显着的量),那么这将阻止GUI的主事件循环,并导致您的GUI“挂”。

你的第一个猜想不应该是广泛测试和使用的部分 python标准库有缺陷。问题是(时99.9%)

while True: 
    print("In your own code.") 
+0

非常感谢你,我发现这非常有用,我很好奇,为什么不这样做,exec(open(path).read(),globals()) – lee