【问题标题】:make python stop until a mouse click [duplicate]使python停止直到鼠标单击[重复]
【发布时间】:2021-03-29 06:08:12
【问题描述】:

我正在这个函数中编写一个脚本,我需要它来读取某个文本框的鼠标位置。我希望脚本在读取鼠标位置并将其分配给变量之前停止,并在单击鼠标时继续。

这里是代码

def savemousepos():
    global mousepossaved
    global mousePosRead
    l = tk.Label(main, text='click on the textbox').pack()
    ##pause script here until mouse click##
    mousePosRead = mouse.position
    r = open("pysettings", "w+")
    r.write(str(mousePosRead))
    r.close()
    l = tk.Label(main, text='position was read and saved.').pack()

我已经尝试过pynput 监听器,但是 a) 我很笨,不知道如何使用它。 b) Python 对监听器和tkinter 同时运行感到愤怒(关于线程)。

我希望有一个使用内置事物或pynput 的解决方案。任何帮助表示赞赏。

【问题讨论】:

  • 为什么要暂停脚本直到鼠标点击?
  • 这样我就可以将光标移动到需要保存鼠标位置的位置
  • 嗯,你可以使用after()方法
  • 重复的问题是否有助于您找到答案? This 一个。
  • @CoolCloud:OP 需要提出一个包含其修改后代码的新问题。

标签: python tkinter pynput


【解决方案1】:
from pynput import mouse

def on_move(x, y):
    print('{0}'.format((x, y)))

def on_click(x, y, button, pressed):
    if button == mouse.Button.left:
        print('Position click = ', '{0}'.format((x, y)))
        return False

mouselistener = None
def mouseOn():
    if mouselistener == None:
        mouselistener = mouse.Listener(on_click=on_click, on_move=on_move)
        mouselistener.start()

while True:
    mouseOn()

或者:

from pynput import mouse

def on_move(x, y):
    print('{0}'.format((x, y)))

def on_click(x, y, button, pressed):
    if button == mouse.Button.left:
        print("Position Click is:", '{0}'.format((x, y)))
        return False

with mouse.Listener(on_click=on_click, on_move=on_move) as listener:
    listener.join()

希望这会有所帮助。

在这两种情况下,当存在左键单击时脚本会停止。

为了使脚本不会停止,您可以将 return False 替换为 return True 或删除该行。

第一个选项在具有另一个侦听器或其他进程的脚本中可能更有用。

第二个选项更适合独立运行。

【讨论】:

  • 有帮助,但没有解决当我尝试在此函数中运行侦听器时 tkinter 窗口冻结的问题。也许我错过了什么?
  • 发布更多关于代码的信息。你在用线程吗?在第二个选项的情况下,您也许可以将函数放在 on_move 或 on_click 中,它会由 listener.join() 执行,您可以尝试将函数放在 join() 中:使用 mouse.Listener ... .. . ... 作为监听器:listener.join (your_function()) 在第一个选项的情况下,您可以尝试在 mouseOn 内连接您的函数,它会在 mouseOn 被调用时执行一次。
  • 如果有必要,把Listener放在一个函数里面,试试用mouseOn()".start()"这个选项但是没有看代码,你无法确切知道发生了什么……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
相关资源
最近更新 更多