2017-12-22 25 views
0

これはかなり簡単な問題のようですが、解決できません。次のコードを実行すると、最初のウィンドウに2つの入力ボックスが表示されます。 'TAB'キーを使用すると、2番目の入力ボックスが表示され、そこから値をListBoxから選択する必要があります。 ListBoxの値が最初のウィンドウの入力ボックスに来る必要がある部分をコーディングしましたが、選択が完了すると2番目のウィンドウを閉じることができません。ListBoxをReturnキーにバインドしてウィンドウを閉じるには

from Tkinter import * 

def fn_jump(event=None): 



    def listbox_update(data): 
     # delete previous data 
     listbox.delete(0, 'end') 

     # put new data 
     for item in data: 
      listbox.insert('end', item) 

    def on_select(event): 
     # display element selected on list 
     print('(event) previous:', event.widget.get('active')) 
     print('(event) current:', event.widget.get(event.widget.curselection())) 
     a = (event.widget.get(event.widget.curselection())) 
     print a 
     txtbox2.delete(0, END) 
     txtbox2.insert(0,a) 
     #listbox.bind('<<Return>>', window3.quit()) #This is not working 



    window3 = Toplevel() 
    window3.title("This window popped out") 
    window3.geometry('{}x{}'.format(500,200)) 



    listbox = Listbox(window3, width=60) 
    listbox.grid(row=0) 

    listbox.bind('<<ListboxSelect>>', on_select) 


    test_list = ('apple', 'banana', 'Cranberry', 'dogwood', 'alpha', 'Acorn', 'Anise', 'Strawberry') 

    listbox_update(test_list) 


root = Tk() 
txtbox1 = Entry(root) 
txtbox2 = Entry(root) 

txtbox1.grid(row=0) 
txtbox2.grid(row=1) 

txtbox2.bind('<KeyRelease>', fn_jump) 


root.mainloop() 

答えて

1

置き換えます

#listbox.bind('<<Return>>', window3.quit()) #This is not working 

をして:

listbox.bind('<Return>', lambda event : window3.destroy()) 

txtbox2.bind('<KeyRelease>', fn_jump)bindが使用するコールバック関数へ参照を期待して、あなたが見ることができるように。また、Enterを押すための正しいbindtypeは'<Return>'ではなく、'<<Return>>'です。

+0

感謝。あなたのコメントは正しい方向に私を指摘しましたが、要件を満たしていませんでした。私は自分自身で回答を投稿します。 – mdabdullah

+0

@mdabdullah私はウィンドウが再開してはならないという要件を知らなかった。これは、入力キーを解放する_is_は、 'txtbox2.bind( ''、fn_jump)'のために 'fn_jump'を呼び出す重要なリリースです。しかしそれは質問には含まれていません。 – Nae

0

このシナリオでは、関数が関数内で定義されているため、ウィンドウを破棄するだけで、プログラムは親関数fn_jump内にあり、2番目のウィンドウを何度も繰り返しポップアウトします。 これを解決するために、私は強制的に問題を解決するルートウィンドウのテキストボックスにフォーカスを設定しました(私は使用できるexit()があると思うでしょうが、私はPythonには比較的新しいです)。

これは、最終的な作業コードは次のとおりです。説明のための

from Tkinter import * 

def fn_jump(event=None): 

    def listbox_update(data): 
     # delete previous data 
     listbox.delete(0, 'end') 

     # put new data 
     for item in data: 
      listbox.insert('end', item) 

    def on_select(event): 
     # display element selected on list 
     print('(event) previous:', event.widget.get('active')) 
     print('(event) current:', event.widget.get(event.widget.curselection())) 
     a = (event.widget.get(event.widget.curselection())) 
     print a 
     txtbox2.delete(0, END) 
     txtbox2.insert(0,a) 


    window3 = Toplevel() 
    window3.title("This window popped out") 
    window3.geometry('{}x{}'.format(500,200)) 
    listbox = Listbox(window3, width=60) 
    listbox.grid(row=0) 
    listbox.focus_set() 
    listbox.bind('<<ListboxSelect>>', on_select) 
    listbox.bind('<Return>', lambda event: window3.destroy()) #This is a fix 
    txtbox1.focus_set()          #This is a fix 
    test_list = ('apple', 'banana', 'Cranberry', 'dogwood', 'alpha', 'Acorn', 'Anise', 'Strawberry') 
    listbox_update(test_list) 


root = Tk() 
txtbox1 = Entry(root) 
txtbox2 = Entry(root) 

txtbox1.grid(row=0) 
txtbox2.grid(row=1) 

txtbox2.bind('<KeyRelease>', fn_jump) 


root.mainloop() 
関連する問題