python - 如何等待鼠标点击?

标签 python input tkinter onclicklistener

我希望我的代码在我单击鼠标左键时启动,但我的代码在我单击按钮后立即启动。如何让我的代码在继续之前等待鼠标输入?

我已经尝试过 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()

功能 在我点击 OK 按钮后立即启动功能 mouseclick 并且我得到了 OK< 的 xclick, yclick/kbd> 按钮。我希望函数 mouseclick 等到我瞄准屏幕上的某物并单击鼠标左键,然后给我 xclick, yclick 我点击的地方。

最佳答案

为什么要使用 win32api 来获取鼠标按钮的按下和位置? Tkinter 可以很好地做到这一点。您可以使用 OK 按钮激活新的鼠标左键绑定(bind),并让该绑定(bind)在被调用时自行禁用。您甚至可以更改光标以指示程序处于您希望用户单击某个位置的状态:

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()

关于python - 如何等待鼠标点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55866778/

相关文章:

python - Paho MQTT 无法与 Flask(Google 应用程序引擎)一起使用

python - 如何在 sympy 中使用 Lambdify 和 IndexedBase 计算导数

python - 命名空间被覆盖的模块中的 Monkeypatch 函数

python - 在 Python 3.7+ 中查找字典中第一项的时间复杂度

javascript - 检查 react 输入表单的小数并更改值

python - 使用 PYTHON 在 "form"中同时显示图像和文本框

php - 更改图像或使用 php 表单保留旧图像

java - Fest swing gui框架,奇怪的输出

python - Tkinter 为每个单选按钮返回相同的值?

ubuntu 中的 Python 3 tkinter iconbitmap 错误