2017-05-21 12 views
0

pyHookを使用してマウスから左クリックを検知してtkinterウィンドウを開き、新しく開いたウィンドウにフォーカスを当てたい。問題は、どのフォーカスメソッドを試しても、フォーカスが新しいtkinterウィンドウに切り替わるのではなく、現在のウィンドウが常にフォーカスを保持するということです。ここでは、コードです:pyHookマウスのLeftTown機能のため、Tkinterウィンドウにフォーカスが得られない

from tkinter import * 
import pyHook 
import pythoncom   

def open_GUI(): 
root = Tk() 
root.title('test') 
entry_box = Entry(root, font=("Calibri", 11)) 
entry_box.focus() 
entry_box.pack(fill=X, side=RIGHT, expand=True) 
root.after(1, lambda: root.focus_set()) 
root.mainloop() 
return True 


def MouseLeftDown_Func(event): 
    print('mouse') 
    open_GUI() 
    return True 


def KeyDown_Func(event): 
    print('key') 
    return True 


hooks_manager = pyHook.HookManager() 
hooks_manager.KeyDown = KeyDown_Func 
hooks_manager.MouseLeftDown = MouseLeftDown_Func 
hooks_manager.HookKeyboard() 
hooks_manager.HookMouse() 
pythoncom.PumpMessages() 

私は、問題は、私が去ったときフォーカスが最近クリックされたウィンドウ(現在のウィンドウ)に優先され、現在のウィンドウをクリックすると、任意のコマンドは、Tkinterのウィンドウを呼びかけていることだと思いますフォーカスは無視されます。

左クリック後、新しいtkinterウィンドウにどのようにフォーカスを切り替えることができますか?

答えて

0

pyhookをインポートした後、もう一方のソリューションをこのソリューションに置き換えました。それはちょっと複雑ですが、キーボードフォーカスを盗もうとしているときは、それが起こります。これを行うより簡単な方法があるかもしれません。このソリューションの鍵は、エントリが作成される前にイベント内でルートウィンドウをフォアグラウンドとして設定するようにアプリケーションに指示することです。 Windowsを使用していない場合は、Linuxソリューションもあります。

from ctypes import Structure, c_ulong, byref, c_char_p, windll 
from tkinter import * 
import pyHook 
import pythoncom 

class POINT(Structure): 
    _fields_ = [("x", c_ulong), ("y", c_ulong)] 

def open_GUI(): 
    root = Tk() 
    root.title('test') 
    root.update() 
    root.after(20, lambda r=root: createEntry(r)) 
    root.mainloop() 
    return True 

def setRootForeground(root): 
    # Get window coordinates 
    x = root.winfo_rootx() + 1 
    y = root.winfo_rooty() + 1 
    # Move the mouse cursor to x,y 
    windll.user32.SetCursorPos(x, y) 
    # Get the pointer coordinates into a Windows-compatible format 
    pt = POINT() 
    windll.user32.GetCursorPos(byref(pt)) 
    # Get the window handle under the pointer -- should be root. 
    hwnd = windll.user32.WindowFromPoint(pt) 
    # Make it the foreground window 
    windll.user32.SetForegroundWindow(hwnd) 

def createEntry(root): 
    setRootForeground(root) 
    root.focus_set() 
    entry_box = Entry(root, font=("Calibri", 11)) 
    entry_box.pack(fill=X, side=RIGHT, expand=True) 
    entry_box.focus_set() 
+0

お返事ありがとうございました。 私はすでにpyhookと焦点workaいいえなしでそれを試してみました。私の主な問題は、pyhookをインポートし、マウスの左クリックを使用してウィンドウを開くときです。あなたはpyhookをインポートしてコードを試してみて、あなたの考えを教えてくれますか? 非常に感謝して、アリ –

関連する問題