gpt4 book ai didi

multithreading - 使用 tkinter + pyhook 时卡住。两个事件循环和多线程

转载 作者:行者123 更新时间:2023-12-02 02:12:08 30 4
gpt4 key购买 nike

我正在用 python 2.7 编写一个工具,记录用户按下键盘或鼠标按钮的次数。点击量将显示在屏幕左上角的小黑框中。即使另一个应用程序处于事件状态,该程序也会记录点击次数。

它工作正常,除非我将鼠标移到框上。然后鼠标会卡住几秒钟,然后程序再次运行。如果我再次将鼠标移到该框上,鼠标将再次卡住,但这次程序崩溃了。

我尝试注释掉 pumpMessages() 然后程序运行。这个问题看起来很像这个问题 pyhook+tkinter=crash , 但那里没有给出解决方案。

其他答案表明,在 python 2.6 中同时使用 wx 和 pyhook 时,dll 文件存在错误。我不知道这在这里是否相关。

我自己的想法是,这可能与并行运行的两个事件循环有关。我读到 tkinter 不是线程安全的,但我看不出如何让这个程序在单个线程中运行,因为我需要同时运行 pumpmessages() 和 mainloop()。

总结一下:为什么我的程序在鼠标悬停时卡住?

import pythoncom, pyHook, time, ctypes, sys
from Tkinter import *
from threading import Thread

print 'Welcome to APMtool. To exit the program press delete'

## Creating input hooks

#the function called when a MouseAllButtonsUp event is called
def OnMouseUpEvent(event):
global clicks
clicks+=1
updateCounter()
return True

#the function called when a KeyUp event is called
def OnKeyUpEvent(event):
global clicks
clicks+=1
updateCounter()
if (event.KeyID == 46):
killProgram()
return True


hm = pyHook.HookManager()# create a hook manager

# watch for mouseUp and keyUp events
hm.SubscribeMouseAllButtonsUp(OnMouseUpEvent)
hm.SubscribeKeyUp(OnKeyUpEvent)

clicks = 0

hm.HookMouse()# set the hook
hm.HookKeyboard()

## Creating the window
root = Tk()
label = Label(root,text='something',background='black',foreground='grey')
label.pack(pady=0) #no space around the label
root.wm_attributes("-topmost", 1) #alway the top window
root.overrideredirect(1) #removes the 'Windows 7' box around the label

## starting a new thread to run pumMessages() and mainloop() simultaniusly
def startRootThread():
root.mainloop()

def updateCounter():
label.configure(text=clicks)

def killProgram():
ctypes.windll.user32.PostQuitMessage(0) # stops pumpMessages
root.destroy() #stops the root widget
rootThread.join()
print 'rootThread stopped'



rootThread = Thread(target=startRootThread)
rootThread.start()

pythoncom.PumpMessages() #pump messages is a infinite loop waiting for events

print 'PumpMessages stopped'

最佳答案

我已经用多处理解决了这个问题:

  1. 主进程处理 GUI (MainThread) 和一个线程,该线程使用来自第二个进程的消息

  2. 子进程 Hook 所有鼠标/键盘事件并将它们推送到主进程(通过队列对象)

关于multithreading - 使用 tkinter + pyhook 时卡住。两个事件循环和多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12278570/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com