Сбой Python при разрушении окна Tkinter

Я студент по разработке программного обеспечения, и я разрабатываю приложение (мое первое приложение!) На Python для целей обучения. Это работает довольно хорошо, и я получил почти все функции, которые я хочу работать.

Краткое объяснение программы: Это административная программа для регистрации членов спортивного клуба. Таким образом, он имеет основные функции, такие как добавление членов, список участников и т. Д.

Для того, чтобы он был завершен, ему также нужна функция для удаления члена. Это всегда работало нормально, но я редко использовал эту функцию.

Теперь, после того как я изменил ttk.Treeview() Объект теперь сортируется по фамилии, я добавил нового члена, чтобы посмотреть, будет ли он сортироваться так, как должен. Это сделал!

Теперь я хотел удалить этот член, но по какой-то причине он больше не работает.

Это разбивает Python. Это не просто сбой приложения, нет ошибки, просто "Pythonw.exe перестал работать".

Вот весь код, который принадлежит этой функции:

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 Функция закрывает указанное окно и снова открывает главное меню.

Сейчас в delforsure(zeid, usure, addwindow) это застревает на линии usure.destroy()

Он больше не печатает строку "ростовщичество уничтожено", которую я положил туда, чтобы увидеть, где она блокируется.

Это не дает никакой ошибки, сам Python просто падает.

Если я перееду

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

под on_return(done), полностью внизу, он закрывает окно и возвращается в главное меню, но главное меню будет отображаться с графическими искажениями и вскоре все равно будет аварийно завершено.

Я действительно не понимаю, что происходит.

Кто-нибудь может помочь мне отследить проблему, пожалуйста?

1 ответ

Решение

Похоже, вы делаете модальное окно да / нет. Есть ли причина, по которой вы не хотите использовать версию, встроенную в 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')
Другие вопросы по тегам