Внесены некоторые изменения, которые теперь выдают ошибку при попытке закрыть Toplevel - PullRequest
0 голосов
/ 12 февраля 2020

В какой-то момент я что-то изменил, и теперь я получаю эту ошибку при попытке закрыть Toplevel () с помощью .destroy () после нажатия кнопки. Я видел одно исправление, в котором использовалась лямбда-функция, но я так и не смог заставить ее работать.
Полный код ошибки:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/__init__.py", line 1702, in __call__
    return self.func(*args)
  File "<string>", line 61, in login_verification
  File "<string>", line 73, in login_success
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/__init__.py", line 2366, in __init__
    Widget.__init__(self, master, 'button', cnf, kw)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/__init__.py", line 2296, in __init__
    (widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: bad window path name ".!toplevel"

Строка 61 - это конец дерева if / else, которое вызывает login_success, строка 73 - это кнопка, которая вызывает функцию delete_popup. Код, который выдает ошибку (на самом деле есть 3 функции, но все они одинаковы, за исключением некоторого текста метки)

def login_success(self):
        popup_screen = Toplevel(main_screen)
        popup_screen.title("Success!")
        popup_screen.geometry('%dx%d+%d+%d' % (w, h, x, y))

        Label(popup_screen, text = "Login was successful.")
        Button(popup_screen, text = "Ok", command = self.delete_popup(popup_screen))

def delete_popup(self, x):
        x.destroy()

1 Ответ

0 голосов
/ 12 февраля 2020

Существует два возможных решения вашей проблемы.

  1. Не используйте функцию, просто передайте popup_screen.destroy в Button как command.
  2. Используйте lambda при передаче вашей функции (delete_popup) на Button в качестве command.

    • Скобки () заставляют функцию выполняться в точке, где передается как command в Button.
    • Если вам нужно передать функцию, у которой нет аргументов, вам не нужны эти круглые скобки ().
    • Если аргументы должны быть переданы функции (Как в вашем case), вы должны использовать lambda, который останавливает выполнение функции в этой точке, чтобы вы могли передать ей свои аргументы. Как это:
    def login_success(self):
        popup_screen = Toplevel(main_screen)
        popup_screen.title("Success!")
        popup_screen.geometry('%dx%d+%d+%d' % (w, h, x, y))
    
        Label(popup_screen, text="Login was successful.")
        Button(popup_screen, text="Ok", command=lambda: self.delete_popup(popup_screen))
    
    
    def delete_popup(self, x):
        x.destroy()
    

Примечание: Ваш отступ в вопросе не является правильным. Надеюсь, вы исправили это в фактическом коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...