Python 在销毁 Tkinter 时崩溃 window

Python crashes upon destroying Tkinter window

我是一名软件开发专业的学生,​​我正在 Python 开发一个应用程序(我的第一个应用程序!)用于学习目的。 它工作得相当好,我几乎可以使用我想要使用的所有功能。

程序简短说明:这是一个用于记录体育俱乐部成员的管理程序。所以它具有添加成员、列出成员等基本功能

为了完整,它还需要一个删除成员的功能。这一直很好用,但我很少使用这个功能。

现在,在我修改 ttk.Treeview() 对象使其现在按姓氏排序后,我添加了一个新成员以查看它是否按应有的方式排序。做到了!

现在我想删除那个成员,但是由于某些原因,它不再有效了。

它崩溃了 Python。它不只是使应用程序崩溃,没有错误,只是简单的 "Pythonw.exe has stopped working".

这是属于该函数的所有代码:

def dellid(zeid, addwindow):
    winsound.PlaySound("SystemHand", winsound.SND_ASYNC)
    usure = tkinter.Tk()
    print('usure window created')
    usure.title('Lid verwijderen')
    usure.geometry('{}x{}'.format('300', '150'))
    usure.iconbitmap(default='programdata\icon.ico')
    usure.attributes("-topmost", True)
    addwindow.grab_set()
    #logo2 = PhotoImage(file="warning.png")
    #logolabel = tkinter.Label(usure, image = logo2)
    #logolabel.grid(row01, columnspan = 2)

    usure.columnconfigure(0, weight = 1)
    usure.columnconfigure(1, weight = 2)

    label01 = tkinter.Label(usure, text = '''
Weet U zeker dat U dit lid wilt verwijderen?
Deze actie kan niet ongedaan worden gemaakt!''').grid(row = 1, columnspan = 2)
    emptyrow = tkinter.Label(usure, text = ' ').grid(row = 2, columnspan = 2)
    jaknop = ttk.Button(usure, text = 'Ja', command = lambda: delforsure(zeid, usure, addwindow)).grid(row = 3, column = 0, sticky = 'E')
    neeknop = ttk.Button(usure, text = 'Nee', command = lambda: nodell(addwindow, usure)).grid(row = 3, column = 1, sticky = 'S') 





def nodell(addwindow, usure):
    addwindow.grab_release()
    usure.destroy()



def delforsure(zeid, usure, addwindow):
    #addwindow.grab_release()
    addwindow.destroy()
    print('addwindow destroyed')
    usure.destroy()
    print('usure destroyed')
    conn = sqlite3.connect('test.db')
    c = conn.cursor()

    opendb = []
    opendb.append(zeid)

    print(zeid)
    print(opendb)

    c.execute("DELETE FROM leden WHERE ids = ?",opendb)
    print('c.execute')
    conn.commit()
    print('c.commit')
    #usure.destroy()

    done = tkinter.Tk()
    done.title('Lid verwijdert')
    done.geometry('{}x{}'.format('300', '150'))
    done.iconbitmap(default='programdata\icon.ico')

    label01 = tkinter.Label(done, text = '''


Lid verwijdert

''')
    label01.pack()

    done.update()
    time.sleep(2)

    on_return(done)

on_return函数关闭上述window并重新打开主菜单。

现在 delforsure(zeid, usure, addwindow) 它锁定在行 usure.destroy()

它不再打印行 'usure destroyed',我把它放在那里是为了看看它在哪里锁定。

它没有给出任何错误,Python 本身就崩溃了。

如果我搬家

usure.destroy()
print('usure destroyed')

on_return(done) 下,一直到底部,它确实关闭了 window 和 return 到主菜单,但是主菜单将被绘制为图形扭曲和不久之后仍然崩溃。

真不明白这是怎么回事

有人可以帮我追踪问题吗?

看起来你在做一个是/否模态window。您是否有理由不想使用 tkinter 内置的版本?

from tkinter import messagebox

def dellid(zeid, addwindow):
    answer = messagebox.askyesno(
        'Lid verwijderen',
        'Weet U zeker dat U dit lid wilt verwijderen?\n'
        'Deze actie kan niet ongedaan worden gemaakt!')
    if answer:
        addwindow.destroy()
        print('addwindow destroyed')