Окно Tkinter не получит фокус из-за функции левой кнопки мыши PyHook
Поэтому я пытаюсь открыть окно tkinter, ощущая щелчки левой кнопкой мыши с помощью pyHook, и я хочу, чтобы вновь открытое окно получило фокус. Проблема в том, что независимо от того, какой метод фокусировки я пытаюсь использовать, текущее окно всегда будет сохранять фокус, а не переключать фокус на новое окно 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 после левого клика?
1 ответ
Я заменил другое решение на это после импорта 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()