我正在尝试构建一个程序,该程序的第一部分是保存用户点击以进行校准。

我为此使用PyUserInput(在Python 3.4.3上),并在GitHub上遵循其教程。目前,这是我的代码:

from pymouse import PyMouseEvent

positions = []

class Click(PyMouseEvent):
    def __init__(self):
        PyMouseEvent.__init__(self)

    def click(self, x, y, button, press):
        if button == 1:
            if press:
                print('Click! X=%d - Y=%d' % (x, y))
                positions.append((x, y))
                print(positions)
        if len(positions) >= 4:
            self.stop()

C = Click()
C.run()

print('Calibrated')


我遇到的问题是,即使在PyMouseEvent停止之后(当位置达到4个值时),我也无法在此之后运行任何东西(即,“ Calibrated”不会打印)。

在PyMouseEvent上调用stop()后,如何继续运行脚本?

感谢您的帮助。

最佳答案

这比“合法”解决方案更多是一种解决方法。这个想法是用引发异常替换stop()方法调用并将run()方法调用包装在try: except:语句中。我建议通过子类化Exception来使自己成为异常,以更好地理解代码。

这里:


from pymouse import PyMouseEvent

positions = []

class ListenInterrupt(Exception):
    pass

class Click(PyMouseEvent):
    def __init__(self):
        PyMouseEvent.__init__(self)
        return

    def click(self, x, y, button, press):
        if button == 1:
            if press:
                print('Click! X=%d - Y=%d' % (x, y))
                positions.append((x, y))
                print(positions)
        if len(positions) >= 4:
            raise ListenInterrupt("Calibrated.")
        return

C = Click()
try:
    C.run()
except ListenInterrupt as e:
    print(e.args[0])


这应该停止事件监听器。如果您希望使用这种方法进行重新校准,则仅重新运行同一侦听器实例将不起作用。解决方案是删除class Click的当前实例,并每次实例化一个新实例。

del C
C = Click()

关于python - PyUserInput-停止PyMouseEvent,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35538828/

10-10 16:19