Python在相互退出后返回函数

Python在相互退出后返回函数,python,Python,退出前一个函数后,如何返回到该函数?我的代码是: import pyHook, pythoncom, sys import msvcrt def test(keyLogging): key = msvcrt.getwche() if key == 'x': print("Worked") sys.exit(0) return None def test2(keyLogging): key = msvcrt.getwche()

退出前一个函数后,如何返回到该函数?我的代码是:

import pyHook, pythoncom, sys
import msvcrt

def test(keyLogging):
    key = msvcrt.getwche()
    if key == 'x':
        print("Worked")
        sys.exit(0)
    return None

def test2(keyLogging):
    key = msvcrt.getwche()
    if key == 'c':
        print("Worked, again")
        sys.exit(0)
    return None

def keyLogging():
    key = msvcrt.getwche()
    if key == 'z':
        hm = pyHook.HookManager()
        hm.KeyDown = test
        hm.HookKeyboard()
        pythoncom.PumpMessages()

    elif key == 'v':
        hm = pyHook.HookManager()
        hm.KeyDown = test2
        hm.HookKeyboard()
        pythoncom.PumpMessages()


keyLogging()
在从
keyLogging
test
test2
调用一个函数并完成调用后,我想返回到keyLogging,再次给出要运行哪个函数的选项。类似于无限循环但有函数的东西
sys.exit()
只是终止一切,我还尝试在这两个函数中执行线程,并在
return

上返回
keyLogging
,只需将
keyLogging()
放在要返回到
keyLogging()
的每个函数调用的末尾。例:

def test(keyLogging):
    key = msvcrt.getwche()
    if key == 'x':
        print("Worked")
    keyLogging()        
    return None

编辑:根据注释,pyhook模块可能有些损坏。
您可能希望使用另一种方式访问windows挂钩API。
我自己没有这个项目的经验,但它似乎得到了积极的维护,不像pyhook,这总是一个好迹象

您的问题并不是真正的“恢复功能”。
似乎您正在windows下设置键盘挂钩,并希望在每次触发挂钩事件时重置键盘挂钩

要做到这一点,您需要重新构造您的程序,因为如果您只是以代码中编写的方式再次调用
keyloging
,您将被多次尝试抽取消息队列和安装多个钩子所困住

pyhook库文档非常糟糕,所以我不确定您会遇到什么样的错误,但这正是重新构造程序以实现干净操作的原因

首先-具有
main
功能,如下所示:

def main():
    keyLogging(False) # call with False parameter means no old hooks to clean up
    pythoncom.PumpMessages()
def test(event):        
    if event.getKey() == 'x' or event.Ascii == 'x':
        print("Worked")

    keyLogging(True)
注意,我在
keyLogging
函数中添加了一个参数,以便该函数知道是否需要执行清理

Second-更改键记录设置功能以启用旧挂钩的清理,并且确保完成后退出:

def keyLogging(cleanup):
    hm = pyHook.HookManager()

    # if you called this function before, uninstall old hook before installing new one!
    if cleanup:
        hm.UnhookKeyboard()

    key = msvcrt.getwche() # ask user for new hook as you did originaly

    # in the if block, only select what hook you want, clean up redundant code!
    if key == 'z':
        hm.KeyDown = test
    elif key == 'v':
        hm.KeyDown = test2

    hm.HookKeyboard() # finally, install the new hook
Third-现在您已经有了一个合适版本的
keyLogging
函数,您可以从钩子函数调用它,以允许用户选择一个新钩子。
请注意,您不能为钩子函数指定与代码中其他名称相同的参数名称
这将被调用,这意味着您将无法从函数中访问其他内容

def test(event):
    key = msvcrt.getwche()
    if key == 'x':
        print("Worked")

    keyLogging(True) # call with True parameter means old hook needs cleanup
现在,您的程序将干净地执行您想要的操作

另一个要考虑的事情是,如果你想知道用户按下哪个键来触发你的<代码>测试< /代码>函数,你就不需要使用<代码> MVCRT。 它已经被传递到函数参数

事件中
,因此您可以这样检查它:

def main():
    keyLogging(False) # call with False parameter means no old hooks to clean up
    pythoncom.PumpMessages()
def test(event):        
    if event.getKey() == 'x' or event.Ascii == 'x':
        print("Worked")

    keyLogging(True)

这是有文档记录的。

代码执行确实返回到函数keyLogging。试试看:在该函数的末尾放一个
print('hi')
。你想在某个地方使用循环吗?
return None
是多余的,因为如果没有它,默认情况下它会返回
None
。是的,但op是这样格式化代码的。我不知道return语句总是None。它可能是一个占位符。除了我在回答中指出的变化外,我只是保持代码与我收到的代码相同。问题不是关于返回语句,所以我不想知道op对他的想法。这就是我得到的
TypeError:“KeyboardEvent”对象是不可调用的
我只是注意到函数不应该嵌入到if语句中,因为它只会在语句计算为时调用keylogging“
True
。打字错误可能是我的打字错误造成的。您的功能是
keyLogging
,而不是
keyLogging
。我现在可以在回答中更新,但在我更新之前,是否有特定原因需要函数末尾的
sys.exit
?如果不这样做,
keyLogging
函数可以在return语句之前的末尾调用,而不是在完成
test
函数之前调用keyLogging。我删除了
sys.exit()
,并在末尾添加了keyLogging,我得到了这个错误。我不想
sys.exit()。但是无论如何,谢谢,我会在找到时间后尽快检查它。如果我使用带有
If event.getKey()=='x'或event.Ascii=='x'的测试函数:
我得到
AttributeError:'KeyboardEvent'对象没有属性'getKey'
,如果我使用另一个带有
key=msvcrt.getwche()的函数
I get
AttributeError:'HookManager'对象没有属性'keyboard\u hook'
您是否仅尝试使用
event.Ascii
?就像我说的,pyhook的文档看起来很垃圾,可能已经过时了。不幸的是,我没有windows机器来测试这个。您得到的错误是哪一行?
AttributeError:“HookManager”对象没有属性“keyboard\u hook”
?下面是代码。我用@Raqun-Bob的话找到了第一个错误的解决方案,但是如果我这样做,我只能运行一次。它一直在运行,但没有得到输入。我按了键,但什么也没做。从你发布的代码来看,pyhook,或者至少你正在使用的特定版本是坏的。Unhookeyboard方法不起作用,即使有文档记录。有一件事您可能想尝试一下:将
HookManager
放在全局变量中,并始终使用相同的变量。也许这就是图书馆制作者的意图。另一个选项是删除取消挂钩代码。不知道那会怎么样,但如果它坏了,试一下也没什么害处。。。