【问题标题】:Running one Autokey script from another Autokey script?从另一个 Autokey 脚本运行一个 Autokey 脚本?
【发布时间】:2021-10-12 17:28:20
【问题描述】:

现在我有两个 Autokey 脚本(用于模块化),一个用于打开文件,一个用于将文本放入其中。

打开文件的那个有热键F1(为了简单起见,我们称这个脚本为1),而将文本放入其中的那个有热键F2。我想要一个新的 Autokey 脚本,当我点击 F3 时,它会同时运行 1 脚本和 2 脚本。

我已经尝试让3 脚​​本只发送F1F2 密钥,但时机已到。如果我可以从3 中调用12 会更好。这可能吗?

谢谢!

【问题讨论】:

    标签: linux autokey


    【解决方案1】:

    https://github.com/autokey/autokey/blob/fc7c6b90f3f28a57ad256829ef2b69e3be5148d2/lib/autokey/scripting.py#L1242

    engine.run_script("<description>")

    应该做的伎俩

    此上下文中的“Description”一般是AutoKey界面侧边栏中的脚本名称。如果您打开脚本的 .json 文件,您肯定可以看到它,但它将是侧栏中显示的名称,除非您在同一文件夹或其他边缘场景中的脚本名称重复

    【讨论】:

      【解决方案2】:

      AutoKey 不是递归的。它不会检查 AutoKey 短语或脚本的输出来查找热键或触发缩写,从而调用进一步的操作。这就是为什么您的初始解决方案不起作用的原因。

      这取决于你实际想要做什么。

      如果您有多个独立有用的脚本,最好的方法是@Icallitvera 提供的一个。

      如果你只是想模块化共享功能,你可以创建函数的 Python 模块并将它们放在 AutoKey Modules 目录中。然后,您可以将它们导入到任何需要它们的 AutoKey 脚本中。

      您可以通过 Settings->Configure AutoKey->Script Engine 从 AutoKey 主菜单中找到/设置模块目录。

      目前,这种方法受到限制,因为以这种方式调用的脚本无法(轻松)访问 AutoKey API,因此它们不能包含任何 API 调用。我们计划在下一个主要版本 AutoKey 0.96 中解决此问题。如果您现在真的需要这样做,请在我们的support listGitter 上询问。

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题,我发现解决该限制的唯一方法是使用 exec() 函数。由于具有共享功能的脚本已经在我使用的 AutoKey 用户文件夹中。因此,为了将我的用户模块“mygame”的共享功能加载到我使用的自动键脚本中:

        exec(open(engine.configManager.userCodeDir + "/" + "mygame.py").read())
        

        为了避免在“导入”多个脚本时出现名称冲突和更像模块的感觉,我将函数放在类中,并使用命名为模块的变量进行实例化。

        所以最后看起来是这样的:

        mygame.py:

        import time
        
        class MyGame:
            def GameReload(self):
                self.GameExitNoSave()
                time.sleep(0.3)
                self.GameLoadCurrent()
        
            def GameExitNoSave(self):
                keyboard.send_key('d')
                time.sleep(0.1)
                keyboard.send_key('<up>')
                time.sleep(0.05)
                keyboard.send_key('<enter>')
        
            def GameLoadCurrent(self):
                keyboard.send_key('<down>')
                time.sleep(0.1)
                keyboard.send_key('<down>')
                time.sleep(0.1)
                keyboard.send_key('<enter>')
                time.sleep(0.5)
                keyboard.send_key('<enter>')
                
        mygame = MyGame()   
        

        AutoKey 中的用户脚本:

        exec(open(engine.configManager.userCodeDir + "/" + "mygame.py").read())
        
        mygame.GameReload():
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-01-13
          • 2016-09-03
          • 1970-01-01
          • 2017-03-30
          • 2019-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多