运行 一个 Autokey 脚本来自另一个 Autokey 脚本?
Running one Autokey script from another Autokey script?
现在我有两个 Autokey 脚本(用于模块化),一个用于打开文件,一个用于将文本放入其中。
打开文件的热键为F1
(为简单起见,我们将此脚本称为1
),而将文本放入其中的热键为F2
.我想要一个新的 Autokey 脚本,当我点击 F3
时,它会同时运行 1
脚本和 2
脚本。
我试过让 3
脚本只发送 F1
和 F2
键,但时机已到。如果我可以从 3
调用 1
和 2
会更好。这可能吗?
谢谢!
engine.run_script("<description>")
应该做到这一点
此处的“描述”一般为AutoKey界面侧边栏中脚本的名称。如果您打开脚本的 .json
文件,您肯定会看到它,但它将是侧栏中显示的名称,除非您在同一文件夹或其他一些边缘场景中有重复的脚本名称
AutoKey 不是递归的。它不会检查 AutoKey 短语或脚本的输出来查找热键或触发将调用进一步操作的缩写。这就是为什么您的初始解决方案不起作用的原因。
这取决于您实际想要做什么。
如果您有多个独立有用的脚本,最好的方法是@Icallitvera 提供的方法。
如果您只想模块化共享功能,您可以创建 Python 个功能模块并将它们放在 AutoKey Modules 目录中。然后,您可以将它们导入到任何需要它们的 AutoKey 脚本中。
您可以通过 Settings->Configure AutoKey->Script Engine
从 AutoKey 主菜单 find/set 模块目录。
目前,这种方法是有限的,因为以这种方式调用的脚本无法(轻松)访问 AutoKey API,因此它们不能包含任何 API 调用。我们计划在下一个主要版本 AutoKey 0.96 中修复此问题。如果您现在真的需要这样做,请在我们的 support list or on Gitter.
上询问
我 运行 遇到了同样的问题,我发现解决该限制的唯一方法是使用 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():
现在我有两个 Autokey 脚本(用于模块化),一个用于打开文件,一个用于将文本放入其中。
打开文件的热键为F1
(为简单起见,我们将此脚本称为1
),而将文本放入其中的热键为F2
.我想要一个新的 Autokey 脚本,当我点击 F3
时,它会同时运行 1
脚本和 2
脚本。
我试过让 3
脚本只发送 F1
和 F2
键,但时机已到。如果我可以从 3
调用 1
和 2
会更好。这可能吗?
谢谢!
engine.run_script("<description>")
应该做到这一点
此处的“描述”一般为AutoKey界面侧边栏中脚本的名称。如果您打开脚本的 .json
文件,您肯定会看到它,但它将是侧栏中显示的名称,除非您在同一文件夹或其他一些边缘场景中有重复的脚本名称
AutoKey 不是递归的。它不会检查 AutoKey 短语或脚本的输出来查找热键或触发将调用进一步操作的缩写。这就是为什么您的初始解决方案不起作用的原因。
这取决于您实际想要做什么。
如果您有多个独立有用的脚本,最好的方法是@Icallitvera 提供的方法。
如果您只想模块化共享功能,您可以创建 Python 个功能模块并将它们放在 AutoKey Modules 目录中。然后,您可以将它们导入到任何需要它们的 AutoKey 脚本中。
您可以通过 Settings->Configure AutoKey->Script Engine
从 AutoKey 主菜单 find/set 模块目录。
目前,这种方法是有限的,因为以这种方式调用的脚本无法(轻松)访问 AutoKey API,因此它们不能包含任何 API 调用。我们计划在下一个主要版本 AutoKey 0.96 中修复此问题。如果您现在真的需要这样做,请在我们的 support list or on Gitter.
上询问我 运行 遇到了同样的问题,我发现解决该限制的唯一方法是使用 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():