2011-01-27 10 views
0

このクラスを2回呼び出すと、初めてキーボードフォーカスがウィンドウに表示されます。 2度目はそうしない。エスケープキーはウィンドウを閉じるために使用され、初めて動作します。エスケープキーが機能するには、ウィンドウをマウスでクリックする必要があります。フォーカスが戻ってこない何かが続いていますか?私はこの問題に何度もぶつかってきましたが、ここで私はできるだけシンプルにそれを見つけました。コードは次のとおりです。2回目のPythonアプリケーションの呼び出しでキーボードフォーカスが得られない

from Tkinter import * 

class Dialog(): # imagine this having buttons and stuff 
    def __init__(self): 
     root = Tk() 
     root.bind_all('<Escape>', lambda event :root.destroy()) 
     root.mainloop() 

# this simulates running a python terminal app which invokes a dialog at some point 
Dialog() # this one accepts the key action 
Dialog() # this one needs a mouse click in the window first 
+1

なぜアプリケーションを終了してもう一度起動するのですか? –

+0

これはこの問題を単純化したものです。だから解析しないでください:)私の実際のケースでは、ターミナルウィンドウでテキストアプリケーションを実行しています。エスケープキーを押すと、Tkinterウィンドウをいくつかの選択肢で表示したいと思っています。これは動作しますが、キーボードのフォーカスを受け取っていないので、キーボードのキーを使用して新しいウィンドウを選択することはできません。次の質問を予期するためには、速度と安定性の面でTkinterテキストウィンドウよりもはるかに優れています。実際の質問は、新しいウィンドウにキーボードのフォーカスが得られることをどうすれば保証できますか? – strawbot

答えて

0

私はちょうどコードを実行しましたが、Windows 7では、どちらの時間にもフォーカスがかかりません。

どのOSで実行していますか?

また、この行をスローすると、強制的にルートウィンドウにフォーカスを移動できます。

root.focus_force()

0

は、Mac上で、エスケープキーが両方の時間を動作しますので、ウィンドウサーバとしてX11を使用してX端末または定期的なターミナルのいずれかを使用して、フォーカスが常にダイアログウィンドウに行きます。 cmd.exeターミナルから実行されているWindows XPでは、フォーカスは最初にダイアログにのみ表示されます。もう一度ウィンドウをクリックする必要があります。しかし、root.focus_force()を使うとどこでも使えるようになります。本当にありがとう!

関連する問題