2016-05-20 2 views
1

Я создаю графический интерфейс с tkinter, который позволяет мне щелкнуть кнопку, которая будет запускать сканирование портов. У меня есть скрипт для сканирования портов, который работает правильно, мне удалось открыть сканер портов с помощью кнопки в графическом интерфейсе, но затем я получаю сообщение об ошибке, которое в противном случае я не получаю при запуске сканера портов.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 (победа) IP_Input.pack (развернуть = tkinter.YES, заполнить = tkinter.NONE) IP_Input.place_configure (width = 120, height = 20) IP_Input.place_configure (x = 40, y = 10) print («IP_Input Done») – lee

+0

это мой основной графический интерфейс - http://pastebin.com/1qgWQ4EL , Это сканер портов - http://pastebin.com/df2QQr8A, но проблемы, похоже, связаны с этим файлом _init_.py. Http://pastebin.com/j03AxHPN – lee

ответ

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

Если словарь Глобалы не содержит значение для ключа встроены, под этим ключом вставлена ​​ссылка на словарь встроенных встроенных модулей. Таким образом вы можете контролировать, какие встроенные функции доступны для исполняемого кода, вставив свой собственный встроенный словарь в глобалы, прежде чем передавать его в exec().

Если вы действительно хотите позвонить в свой файл таким образом, вы должны просто использовать os.system.

Альтернативный подход:

Вы действительно не нужно называть файл таким образом. Теперь у вас есть два экземпляра Tk(). Если вам нужно другое окно, для этого предусмотрен виджет. Это виджет Toplevel. Вы можете реструктурировать свой код, чтобы создать экземпляр Toplevel, содержащий приложение сканера портов, нажав кнопку. Например, создайте приложение сканера портов с помощью виджета Toplevel (в другом файле, если хотите), затем импортируйте «приложение» в свой файл и нажмите кнопку «Инициализировать приложение».

Дополнительные примечания:

Вы вызов while петли, и если это работает (для какого-либо заметного количества времени), то это будет блокировать основной цикл обработки событий графического интерфейса и заставляя ваш GUI «повесить ».

Ваша первая догадка не должна состоять в том, что часть тестируемой и используемой стандартной библиотеки python является ошибочной. Проблема заключается в том (99,9% времени)

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

Большое спасибо, я нашел это очень полезным, мне любопытно, почему бы не сделать это таким образом, exec (open (path) .read(), globals()) – lee

Смежные вопросы