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')
我是一名软件开发专业的学生,我正在 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')