Gui带按钮打开端口扫描器

时间:2016-05-20 16:47:23

标签: python user-interface port

我正在使用tkinter创建一个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))

1 个答案:

答案 0 :(得分:1)

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

这不会起作用。

为什么这不起作用:

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

所以,为了完成这项工作(我不推荐)你必须使用:

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

来自documentation

  

如果全局字典不包含键 builtins 的值,则在该键下插入对内置模块内置字典的引用。这样,您可以通过将自己的 builtins 字典插入到globals中,然后将其传递给exec()来控制已执行代码可用的内置函数。

如果您真的想以这种方式调用文件,那么您应该使用os.system

替代方法:

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

附加说明:

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

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

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