2017-05-21 16 views
0

때문에 Tkinter 창이 포커스를 얻지 못합니다. 따라서 pyHook을 사용하여 마우스 왼쪽 단추를 감지하여 tkinter 창을 열고, 새로 열린 창에 포커스를 맞추기를 원합니다. 문제는 초점 방법이 무엇이든 상관없이, 현재 창은 초점이 새로운 tkinter 창으로 전환하는 대신 항상 초점을 유지한다는 것입니다. 여기 코드는 다음과 같습니다pyHook 마우스 왼쪽 단추 기능

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 코드를 사용해보고 내가 생각하는 것을 알려주시겠습니까? 많이 감사 드리며 알리 –