Python函数等待鼠标点击

时间:2019-04-26 11:35:38

标签: python input tkinter onclicklistener

当我单击LMB时,我希望我的代码开始,但是单击按钮后,我的代码立即开始。如何让我的代码在继续输入之前先等待鼠标输入?

我已经尝试过input()了,但这不是我想要的

from tkinter import *
import PIL.ImageGrab
from PIL import ImageGrab
import time
import numpy as np
import pyautogui
import win32api

def mouseposition():
    global xclick
    global yclick
    xclick, yclick = win32api.GetCursorPos()
    print(xclick, yclick)

def mouseclick():
    state_left = win32api.GetKeyState(0x01) # Left button down = 0 or 1. Button up = -127 or -128
    a = win32api.GetKeyState(0x01)
    if a != state_left:
        mouseposition() # Button state changed
        state_left = a
        print("1")
    else:
        mouseposition()
        print("2")

def something():
    window.update()
    mouseclick()

window = Tk()
window.geometry("700x500")
window.title("Testing")

b = Button(window, text="OK", command=something)
b.grid(row=0, column=2, sticky=W)

window.update()
window.mainloop()

功能当我单击“确定”按钮后立即单击鼠标右键,然后得到确定按钮的xclick,yclick。我要让mouseclick功能等待,直到我瞄准屏幕上的某物,然后单击鼠标左键,然后再给我xclick,单击我单击的位置。

1 个答案:

答案 0 :(得分:1)

为什么使用win32api来获得鼠标按键的按下和位置? Tkinter可以做到这一点。您可以使用“确定”按钮来激活新的鼠标左键绑定,并在调用该绑定时使其自身禁用。您甚至可以更改光标以指示该程序处于您期望用户单击某个位置的状态:

from tkinter import *


def enable_mouseposition():
    window.bind("<Button-1>", get_mouseposition)
    window.config(cursor="crosshair")


def get_mouseposition(event):
    print(event.x, event.y)
    window.unbind("<Button-1>")
    window.config(cursor="arrow")

window = Tk()
window.geometry("700x500")
window.title("Testing")

b = Button(window, text="OK", command=enable_mouseposition)
b.grid(row=0, column=2, sticky=W)


window.mainloop()

我现在了解到您希望能够在屏幕上的所有位置获得点击,而不仅仅是在tkinter窗口中。在这种情况下,除了tkinter之外,您还需要其他东西,例如win32api。另外,由于无法通过在窗口外部单击来生成tkinter事件,因此需要一个循环来反复检查按钮状态,直到单击按钮为止。您可以使用after在tkinter中进行循环而不会阻塞主循环:

from tkinter import *
import win32api


def enable_mouseposition():
    window.after(10, get_mouseposition)


def get_mouseposition():
    state_left = win32api.GetKeyState(0x01)
    if state_left == -127 or state_left == -128:
        xclick, yclick = win32api.GetCursorPos()
        print(xclick, yclick)
    else:
        window.after(10, get_mouseposition)

window = Tk()
window.geometry("700x500")
window.title("Testing")

b = Button(window, text="OK", command=enable_mouseposition)
b.grid(row=0, column=2, sticky=W)

window.mainloop()