【问题标题】:Python - Code ignores `if`-statement?Python - 代码忽略“if”语句?
【发布时间】:2015-11-14 08:43:52
【问题描述】:

几个小时前我刚刚开始使用 Python (Jython) 编码,我正在尝试使用 Sikuli IDE 自动化 Kik messenger(使用 Android 模拟器)。

我正在尝试创建一个区域观察器来扫描更改,如果进行了更改,它将检查是否找到任何命令。我不太确定自己在做什么,但这是我在网络和文档中的一些帮助下得到的代码:

cmdScanLoc = Region(Region(65,762,167,59))

def cmdHelp():
    type("Help")
    type(Key.ENTER)
    cmdScanLoc.stopObserver()

def cmdPing():
    type("Pong.")
    type(Key.ENTER)
    cmdScanLoc.stopObserver()

def changeDetected(event):
    print("Change")
    if cmdScanLoc.exists("1440090739688.png"):
        cmdHelp()
    elif cmdScanLoc.exists("1440090725124.png"):
        cmdPing()
    else:
        print("No Command Found")

def startObserver():
    cmdScanLoc.onChange(50,changeDetected)
    cmdScanLoc.observe(10,background=False)
    Settings.ObserveScanRate = 10

startObserver()

这是日志,输入 !ping:

Change

!help
[log] TYPE "Help"

[log] TYPE "#ENTER."

它似乎转到cmdHelp(),即使我输入了!ping。这怎么可能?它只是完全忽略了if-statement。

这是我正在扫描的区域的图像: http://i.imgur.com/QAP9OnV.png 以及我正在扫描的图像的图像: http://i.imgur.com/wXxphQN.png (此图中的代码不再准确,如您所见)

如果有人能用这个“命令扫描器”引导我朝着正确的方向前进,我将不胜感激,如果检测到某个命令,就会调用相应的函数。

非常感谢,如果这是一个非常愚蠢的问题,我很抱歉,我已经尝试了几个小时,查找 Sikuli 和 Python 的文档,但我无法让它工作......

【问题讨论】:

  • 所以我一直在努力让这个东西工作很长时间,而且它似乎太不稳定了(它似乎完全忽略了if 声明,然后继续观察到更改时直接发送至cmdHelp()。)请有经验的python/jython 程序员指导我找到更好的方法来做这种事情。 :) 提前致谢!
  • 它可能不会忽略 if 语句,它可能是 `cmdScanLoc.exists("1440090739688.png")' 的评估结果为真。
  • 我不知道为什么我被否决了,因为我确实做了很多研究,这个问题对我来说似乎很清楚。我什至添加了图像以使其更清晰......如果反对我的人能给我建设性的批评,那就更好了。
  • @skyking 你能告诉我如何解决这个问题吗?说到 Python 和 Sikuli,我真的是个菜鸟。无法返回true,因为在我选择的区域中找不到图像,这就是为什么我很迷茫……是卡在内存中,还是?
  • 说到 Sikuli,我可能更菜鸟,所以我的建议更多的是关于 python 部分。我仍然认为它返回 true,看到你可以打印结果,首先将它分配给一个变量(即exists = cmdScanLoc.exists("1440090739688.png")),打印变量并最终在测试中使用它(即if exists: 而不是if cmdScanLoc...)。如果它像我期望的那样打印为错误的东西,我会说这是一个 Sikuli 问题 - 在这方面我无法帮助你。

标签: python python-2.7 if-statement sikuli observers


【解决方案1】:

与使用if-statement 相比,使用区域观察者执行此类操作要聪明得多,也快得多。示例代码:

def cmd1(event):
    print("Command One")
    event.cmdRegion.stopObserver()
    waitCmdAppear()

def cmd2(event):
    print("Command Two")
    event.cmdRegion.stopObserver()
    waitCmdAppear()

def cmd3(event):
    print("Command Three")
    event.cmdRegion.stopObserver()
    waitCmdAppear()

def waitCmdAppear():
    cmdRegion.onAppear(Pattern("1.png").exact(), cmd1)
    cmdRegion.onAppear(Pattern("2.png").exact(), cmd2)
    cmdRegion.onAppear(Pattern("3.png").exact(), cmd3)
    cmdRegion.observe(FOREVER)

waitCmdAppear()

不要忘记的事情:

  1. 定义将由区域观察者调用的函数时的(事件)部分。
  2. 在事件中停止观察者,即使您将再次需要它。只需重新启动它。
  3. 在 onAppear 中,(region.onAppear([PS], [handler])) 键入处理程序(例如cmd3)而不是函数(例如cmd3()

我希望这对其他人有所帮助。 :)

【讨论】:

  • 编辑了我的答案,因为有更好的方法可以做到这一点。我希望我能帮助某人。 :)
猜你喜欢
  • 2020-10-28
  • 2015-08-13
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
相关资源
最近更新 更多