Tkinter 特金特窗口赢得';由于pyHook鼠标左下键功能,无法获取焦点

Tkinter 特金特窗口赢得';由于pyHook鼠标左下键功能,无法获取焦点,tkinter,pyhook,pythoncom,Tkinter,Pyhook,Pythoncom,因此,我试图通过使用pyHook感知鼠标左键点击来打开tkinter窗口,我希望新打开的窗口获得焦点。问题是,无论我尝试什么聚焦方法,当前窗口将始终保持焦点,而不是焦点切换到新的tkinter窗口。代码如下: from tkinter import * import pyHook import pythoncom def open_GUI(): root = Tk() root.title('test') entry_box = Entry(root, font=("Calib

因此,我试图通过使用pyHook感知鼠标左键点击来打开tkinter窗口,我希望新打开的窗口获得焦点。问题是,无论我尝试什么聚焦方法,当前窗口将始终保持焦点,而不是焦点切换到新的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窗口吗?

导入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()

嘿,罗恩,谢谢你的回复。我已经在没有pyhook和focus的情况下尝试过了。我的主要问题是当我导入pyhook并使用鼠标左键单击打开窗口时。你能试试导入pyhook的代码并告诉我你的想法吗?非常感谢,阿里