2017-05-21 6 views
0

Fokus bekommen, also versuche ich ein tkinter Fenster zu öffnen, indem ich linke Klicks von der Maus mit pyHook erfahre, und ich möchte, dass das neu geöffnete Fenster den Fokus bekommt. Das Problem besteht darin, dass das aktuelle Fenster unabhängig von der Fokusmethode, die ich versuche, immer den Fokus behält, anstatt den Fokus auf das neue tkinter-Fenster zu setzen. Hier ist der Code:Tkinter Fenster wird nicht wegen pyHook Maus LeftDown Funktion

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

ich glaube, das Problem ist, dass, wenn ich auf dem aktuellen Fenster klicken links der Fokus auf das Fenster priorisiert wird, das zuletzt geklickt wurde (das aktuelle Fenster), und jeder Befehl fordert eine tkinter Fenster Fokus wird ignoriert.

Weiß jemand wie ich nach dem Linksklick den Fokus auf das neue tkinter Fenster umschalten kann?

Antwort

0

Ich ersetzte die andere Lösung mit dieser nach dem Importieren von Pyhook. Es ist ein bisschen komplex, aber wenn Sie versuchen, den Tastaturfokus zu stehlen, passiert das. Es kann einen einfacheren Weg geben, dies zu tun. Der Schlüssel zu dieser Lösung besteht darin, der Anwendung mitzuteilen, dass das Stammfenster als Vordergrund festgelegt wird, bevor der Eintrag erstellt wird, jedoch innerhalb eines Ereignisses. Wenn Sie keine Windows verwenden, gibt es auch eine Linux-Lösung.

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

Hey Ron, danke für die Antwort. Ich habe es schon ohne Pyhook und den Fokus Worka in Ordnung versucht. Mein Hauptproblem ist, wenn ich Pyhook importiere und den linken Mausklick verwende, um das Fenster zu öffnen. Können Sie den Code mit Pyhook importieren und lassen Sie mich wissen, was Sie denken? Sehr geschätzt, Ali –