2017-05-04 72 views
0

我是一名軟件開發學生,我正在開發一個應用程序(我的第一個應用程序! 它工作得很好,我幾乎獲得了所有想要工作的功能。破壞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()

它不打印行「USURE摧毀」了,我放在那裏,看看它鎖定了。

它不給任何錯誤,Python本身只是崩潰。

如果我提出

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

on_return(done)下,在底部一路,它關閉該窗口,並返回到主菜單,但主菜單與圖形失真繪製,並很快仍然崩潰之後。

我真的不明白是怎麼回事。

任何人可以幫助我跟蹤這個問題嗎?

+0

這聽起來像是你從IDLE運行這個,是嗎?如果是這樣,你可以嘗試從命令行運行它嗎? – Novel

+1

將您的應用程序減少到展示該問題的最少量代碼,然後**在這裏將問題發佈到一個問題中。 – martineau

+0

如果您在程序中多次調用'Tk()'和/或'maniloop()',那就是問題的一部分如果您需要額外的窗口,則創建'Toplevel'實例。 –

回答

0

看起來你正在做一個yes/no模態窗口。您是否有理由不想使用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') 
+0

謝謝! 我不知道tkinter有一個內置的感謝教我! – deWaardt