我正在尝试构建一个程序,该程序的第一部分是保存用户点击以进行校准。
我为此使用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/