彼此退出后,Python返回函数

时间:2018-12-14 15:13:04

标签: python

退出上一个函数后如何返回该函数?我的代码是这样的:

enabled-protocols

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() keyLoggingtest调用一个函数,并且被调用的函数完成后,我想返回到键盘记录,以再次给出一个选项来运行哪个函数。类似无限循环但具有功能的东西。 test2仅终止所有操作,我还尝试了在两个函数中进行线程化,并在sys.exit()上返回了keyLogging

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

编辑:根据注释,看来pyhook模块可能已损坏。
您可能需要使用pywin32来以其他方式访问Windows挂钩API。
我自己没有这个项目的经验,但是它似乎得到了积极的维护,与pyhook不同,这总是一个好兆头。

您的问题不是关于“恢复功能”的问题。
看来您是在Windows下设置一个键盘钩,并且每次钩事件触发时都想重置它。

要执行此操作,您需要重组程序,因为如果您只是简单地以编写代码的方式再次调用keyLogging,则您将陷入多次尝试抽送消息队列和安装多个钩子的过程中

pyhook库文档非常糟糕,因此我不确定会遇到什么样的错误,但这更多的原因是为了干净运行而重组程序。

第一-具有main功能,如下所示:

def main():
    keyLogging(False) # call with False parameter means no old hooks to clean up
    pythoncom.PumpMessages()

注意,我在您的keyLogging函数中添加了一个参数,这样该函数将知道是否需要执行清理。

第二-更改密钥记录设置功能以启用对旧钩子的清理,并确保完成后退出:

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

第三-现在您拥有合适的keyLogging函数版本,可以从钩子函数中调用它,以允许用户选择新的钩子。
请注意,您一定不能给钩子函数一个参数名称,该名称应与代码中的另一个名称相同!
这称为'shadowing',这意味着您将无法从函数中访问其他内容!

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

    keyLogging(True) # call with True parameter means old hook needs cleanup

现在您的程序将完全执行您想要的操作。

还要考虑的另一件事是,如果您想知道用户按下了什么按键来触发test功能,则无需使用msvcrt.getwche()
它已经在函数参数event中传递,因此您可以像这样检查它:

def test(event):        
    if event.getKey() == 'x' or event.Ascii == 'x':
        print("Worked")

    keyLogging(True)

已记录在here中。