2017-05-04 11 views
0

私はソフトウェア開発の学生で、私は学習目的で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()

それはもう「破壊usure」行を印刷しないでロックアップします。

これはエラーを起こさず、Python自体がクラッシュします。

私はon_return(done)

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

、一番下のすべての方法、それはウィンドウを閉じ、メインメニューに戻りませんが、主なメニューは、グラフィカルな歪みで描画されるとすぐに、まだクラッシュ移動した場合その後。

私は実際に何が起こっているのか分かりません。

誰でも問題を追跡してください。

+0

これはIDLEから実行しているようですが、そうですか?もしそうなら、これをコマンドラインから実行できますか? – Novel

+1

問題が発生しているコードの最小量にアプリケーションを減らし、**ここに質問に投稿してください。 – martineau

+0

あなたのプログラムで 'Tk()'や 'maniloop()'を2回以上呼び出す場合、それが問題の一部です。余分なウィンドウが必要な場合は、 'Toplevel'のインスタンスを作成してください。 –

答えて

0

はい/いいえモーダルウィンドウを作っているようです。 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

関連する問題