2017-08-10 38 views
0

現在、多くのtkinterフレームを使用するプログラムを実装しています。サブフレームが開かれている間は、スーパーフレームをユーザーにロックしたい(そうでなければ機能しません)。いくつかの研究の後、私はgrab_setとgrab_releaseメソッドがかなりうまく動作することを発見しました。Tkinterフォーカスがaskstring後に失われました

しかし、(Toplevelによってインスタンス化された)サブフレームがaskstringを呼び出すと、グラブは「losed」となり、ユーザーはスーパーレベルウィンドウと再び対話できます。ユーザが「ASDF」のサブフレームが開かれている間の期間のためにロックされますを含むフレームを「ASDF」リンクをクリックしてサブフレームを開いたら

import tkinter as tk 
import tkinter.simpledialog 

root = tk.Tk() 
def open_sublevel(): 
    tl = tk.Toplevel(root) 
    def ask(): 
     print(tk.simpledialog.askstring("askstring", "askstring")) 
    tk.Button(tl, text="ask", command=ask).pack() 
    tl.grab_set() 
    root.wait_window(tl) 
    tl.grab_release() 
    print("release") 


tk.Button(root, text="asdf", command=open_sublevel).pack() 
tk.mainloop() 

:例では、この(非常に簡略化されたコード)であろう。しかしながら、ユーザがサブフレーム内の「尋ねる」ボタンを選択すると、この「ロック」が何とか消える。

+0

[MCVE]を提供してください。また、どのプラットフォームを使用しているかを知るのにも役立ちます。 –

+0

まあ、最小限の例ではありません...スーパーレベルモジュールは、私が書いた他のさまざまなモジュールをインポートするので、私はすべてのモジュールとサブモジュールを投稿する必要があります。 – PfannkuchenXD

+0

私はできるだけ単純化して、コードをオリジナルの投稿(すべてのPython 3.Xでコンパイル可能)に投稿しました。私はWindows10で作業しています。 – PfannkuchenXD

答えて

1

Tkinterのライブラリ内のノートによると:

グラブは、このアプリケーション内では子孫のウィジェットにすべてのイベントを指示します。

私はあなたのaskstringを提出し終わった後grab_set()が落ちている理由を説明する任意のドキュメントを見つけることが、これまでできないですが、ウィジェットがなくなっていたらgrab_set()が落ちるので、私はそれがある結像するでしょう。 Toplevelウィンドウを閉じる場合と同じです。

この場合、ウィンドウが閉じると、tl.grab_release()はグラブリリースとしては必要ないように見えます。

askstringが完了した後にgrab_set()をリセットした場合、私がテストしたことから、正常に動作します。

tl.grab_set()をちょうどprint(tk.simpledialog.askstring("askstring", "askstring"))の下に追加する必要があります。

以下修正されたコード:

import tkinter as tk 
import tkinter.simpledialog 

root = tk.Tk() 

def open_sublevel(): 
    tl = tk.Toplevel(root) 
    tl.grab_set() 

    def ask(): 
     print(tk.simpledialog.askstring("askstring", "askstring")) 
     tl.grab_set() 

    tk.Button(tl, text="ask", command=ask).pack() 
    print("release") 

tk.Button(root, text="asdf", command=open_sublevel).pack() 
tk.mainloop() 
関連する問題