我正在使用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)
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 :(得分:1)
问题在于您的exec
声明。您正在打开名为.py
的其他port_scanner.py
文件,然后拨打exec(open("./port scanner.py))
。
这不会起作用。
为什么这不起作用:
执行exec(open("path to .py file").read())
exec当然是执行此代码,但问题是此文件中的全局变量不在范围内。
所以,为了完成这项工作(我不推荐)你必须使用:
exec(open(path).read(), globals())
如果全局字典不包含键 builtins 的值,则在该键下插入对内置模块内置字典的引用。这样,您可以通过将自己的 builtins 字典插入到globals中,然后将其传递给exec()来控制已执行代码可用的内置函数。
如果您真的想以这种方式调用文件,那么您应该使用os.system
。
替代方法:
你真的不需要这样调用你的文件。您现在有两个Tk()
运行的实例。如果您需要另一个窗口,则会为此提供一个窗口小部件。它是Toplevel
小部件。您可以重新构建代码,以便在按钮单击时创建包含端口扫描程序应用程序的Toplevel
实例。例如,使用Toplevel小部件创建您的端口扫描程序应用程序(如果您愿意,可以在您的其他文件中),然后将“app”导入到您的文件中,然后在按钮上单击它以初始化应用程序。
附加说明:
你正在调用一个while
循环,如果这个循环运行(任何明显的时间),那么这将阻止GUI的主事件循环并导致你的GUI“挂起”。
您的第一个猜测不应该是广泛测试和使用的 python标准库的一部分存在缺陷。问题是(99.9%的时间)
while True:
print("In your own code.")