_tkinter.TclError: неверное имя пути окна - PullRequest
0 голосов
/ 26 февраля 2020

Я делаю приложение, которое использует tkinter и, в конечном итоге, использует сокеты Мой код в настоящее время состоит из этого:

import tkinter as tk # imports tkinter module
from tkinter import * # imports tkinter module

a=tk.Tk()
a.title('Custodian Alert Tool')
List=['','','']
List.clear()

def Clear():
            for widget in a.winfo_children(): # clears the window for the next Page
                        widget.destroy()

def Home():
            Clear()
            Label(a,text='Welcome to the Custodian Alert Tool.').pack()
            Label(a,text='').pack()
            SubmitButton=tk.Button(a,text='Submit A Ticket',command=Submit)
            SubmitButton.pack()
            ExitButton=tk.Button(a,text='Exit',command=Exit)
            ExitButton.pack()
            a.mainloop()

def Submit():
            Clear()
            def Append1(): # the button calls this function when pressed
                        List.append(x.get())
                        Gender()
            Label(a,text='Which bathroom are you reporting for?').pack()
            f=tk.Frame(a)
            f.pack()
            x=tk.StringVar()
            E=tk.Entry(f,textvariable=x)
            E.grid(row=1,column=1)
            b1=tk.Button(f,text='Submit',command=Append1) # the error occurs after I click this button
            b1.grid(row=1,column=2)

def Gender():
            Clear()
            def Append2(y):
                        List.append(y)
                        Issue()
            Label(a,text='Boys or Girls?').pack()
            f=tk.Frame(a)
            f.pack()
            b1=tk.Button(f,text='Boys',command=Append2('Boys'))
            b1.grid(row=1,column=1)
            b2=tk.Button(f,text='Girls',command=Append2('Girls'))
            b2.grid(row=1,column=2)
def Issue():
            Clear()


def Exit():
            a.destroy()

Home()

Когда я нажимаю кнопку b1 под функцией Отправить, я получаю это:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/tkinter/__init__.py", line 1550, in __call__
    return self.func(*args)
  File "/Users/skor8427/Desktop/AlertClient.py", line 27, in Append1
    Gender()
  File "/Users/skor8427/Desktop/AlertClient.py", line 45, in Gender
    b1=tk.Button(f,text='Boys',command=Append2('Boys'))
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/tkinter/__init__.py", line 2209, in __init__
    Widget.__init__(self, master, 'button', cnf, kw)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/tkinter/__init__.py", line 2139, in __init__
    (widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: bad window path name ".4610182280"

Это самая большая ошибка, которую я когда-либо имел получил, и я понятия не имею, с чего начать. Кто-нибудь знает, что я могу сделать?

1 Ответ

1 голос
/ 26 февраля 2020

Когда вы делаете это:

b1=tk.Button(f,text='Boys',command=Append2('Boys'))

Он ведет себя точно так же, как это:

result = Append2('Boys'))
b1=tk.Button(f,text='Boys',command=result)

Когда вызывается Append2, он вызывает Issue, что вызывает Clear который уничтожает всех детей в a. f находится в a, поэтому f уничтожается. Это означает, что вы пытаетесь создать b1 как дочерний элемент уничтоженного виджета. И , что - вот почему вы получаете сообщение об ошибке «неправильное имя пути окна» - эта криптированная c строка - это имя уничтоженного виджета.

Вам нужно изменить конструкцию b1, чтобы она была примерно такой:

b1 = Button(f, text='Boys', command=lambda: Append2('Boys'))`

Это будет откладывать вызов Append2 до нажатия кнопки.

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