Python функция ожидания щелчка мыши - PullRequest
0 голосов
/ 26 апреля 2019

Я хочу, чтобы мой код запускался при нажатии ЛКМ, но мой код запускается сразу после нажатия кнопки.Как заставить мой код ждать ввода мыши, прежде чем продолжить?

Я уже пробовал ввод (), но это не то, что я ищу

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 кнопки ОК.Я хочу, чтобы функция щелчка мышью ждала, пока я нацелусь на что-то на экране, и нажму левую кнопку мыши, и ТО даст мне щелчок мышью, щелчок мышью по месту, на которое я нажимаю.

1 Ответ

1 голос
/ 26 апреля 2019

Почему вы используете win32api, чтобы получить нажатие и расположение кнопки мыши?Tkinter может сделать это просто отлично.Вы можете использовать кнопку OK, чтобы активировать новую привязку левой кнопкой мыши и позволить этой привязке отключиться самостоятельно, когда она была вызвана.Вы даже можете изменить курсор, чтобы указать, что программа находится в состоянии, когда вы ожидаете, что пользователь нажмет на местоположение:

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, щелкнув за пределами окна, вам потребуется цикл, который проверяет состояние кнопки несколько раз, пока кнопка не будет нажата.Вы можете сделать цикл в tkinter, не блокируя основной цикл, используя after:

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