gpt4 book ai didi

python - Tkinter 使用 pyHook 撤回奇怪的内容

转载 作者:太空宇宙 更新时间:2023-11-03 16:26:50 24 4
gpt4 key购买 nike

我有一个 Tkinter GUI 应用程序,需要在按下按钮时隐藏它。我不能假设应用程序将具有焦点,因此我实现了键盘记录器样式的 pyHook。但是,每当我从 pyHook 启动的函数调用withdraw() 时,窗口就会挂起,我必须强制关闭它。

为了测试,我在 GUI 内部添加了一个按钮来调用完全相同的函数,并且它工作得很好。这是怎么回事? 'hiding' 打印了两次,所以我知道它确实卡在withdraw() 调用本身上。

下面是一个最小的完整可验证示例,用于演示我的意思:

from Tkinter import *
import threading
import time

try:
import pythoncom, pyHook
except ImportError:
print 'The pythoncom or pyHook modules are not installed.'

# main gui box
class TestingGUI:
def __init__(self, root):

self.root = root
self.root.title('TestingGUI')

self.button = Button(root, text="Withdraw", command=self.Hide) # works fine
self.button.grid()

def ButtonPress(self, scancode, ascii):
if scancode == 82: # kp_0
self.Hide() # hangs

def Hide(self):
print 'hiding'
self.root.withdraw()
time.sleep(2)
self.root.deiconify()

root = Tk()
TestingGUI = TestingGUI(root)

def keypressed(event):
key = chr(event.Ascii)
# have to start thread in order to return True as required by pyHook
threading.Thread(target=TestingGUI.ButtonPress, args=(event.ScanCode,key)).start()
return True

def startlogger():
obj = pyHook.HookManager()
obj.KeyDown = keypressed
obj.HookKeyboard()
pythoncom.PumpMessages()

# need this to run at the same time
logger = threading.Thread(target=startlogger)
# quits on main program exit
logger.daemon = True
logger.start()

# main gui loop
root.mainloop()

最佳答案

按照 this answer here 解决:

本质上,Tkinter 类中负责处理按键的函数 ButtonPress 不能从另一个线程调用。

关于python - Tkinter 使用 pyHook 撤回奇怪的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37909046/

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