Совместное использование PIL и pynput: почему захват не захватывает правильную область? - PullRequest
0 голосов
/ 10 марта 2019

Новичок на питоне. Я написал программу, которая позволяет пользователю создавать скриншот, используя только мышь с pynput для мониторинга движений мыши и PIL для создания скриншота. Если пользователь перетаскивает мышь над областью, когда нажата левая кнопка, а затем щелкает колесо прокрутки, он делает снимок экрана. Тем не менее, мои скриншоты даже не близко к правильной области.

from pynput import mouse
from PIL import Image, ImageGrab

def mouse_listen(x,y):
    pass
    #print("Position of mouse {}.\n".format((x,y)))

starting_position = ()
end_position = ()
left_flag = False

def button_clicked(x,y,button,pressed):
    global left_flag
    global starting_position
    global end_position

    if(button == mouse.Button.left and pressed):
            starting_position = (x,y)
            left_flag = True
            print("I clicked left at {}.\n".format(starting_position))

    #if scroll is clicked while left is pressed, create a screenshot
    if(button == mouse.Button.middle and pressed and left_flag):
            print("I clicked middle at {}.\n".format((x,y)))
            end_position = (x,y)
            get_screenshot(starting_position, end_position)

    if(button == mouse.Button.middle and pressed and not left_flag):
            print("I clicked middle but left wasn't held.\n")

    if (button == mouse.Button.left and not pressed):
            print("I released left.\n")
            left_flag = False

def get_screenshot(start,end):

    print("The start (x,y) are ({},{}) and the end (x,y) are ({},{}).\n".format(start[0], start[1], end[0], end[1]))

    #Case 1: user drags from upper left to bottom right
    if (start[0] < end[0] and start[1] < end[1]):
            im = ImageGrab.grab(bbox=(start[0], start[1], end[0], end[1]))
            im.show()
    #Case 2: user drags from bottom right to upper left
    elif (start[0] > end[0] and start[1] > end[1]):
            im = ImageGrab.grab(bbox = (end[0], end[1], start[0], start[1]))
            im.show()
    #Case 3: user drags from bottom left to upper right
    elif (start[0] < end[0] and start[1] > end[1]):
            im = ImageGrab.grab(bbox = (start[0], end[1], end[0], start[1]))
            im.show()
    #Case 4: user drags from upper right to bottom left
    elif (start[0] > end[0] and start[1] < end[1]):
            im = ImageGrab.grab(bbox = (end[0], start[1], start[0], end[1]))
            im.show()

    #Edge Case: starting position and end are same (no screenshot)
    else:
            pass

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

Я нашел, как определяется bbox здесь на основе другого сообщения stackoverflow, и я думаю, что мои случаи определяют его правильно. Единственный случай, который не работает должным образом, это случай по умолчанию (начальная и конечная позиции одинаковы), потому что по какой-то причине значение щелчка прокрутки усекается, а щелчок левой кнопкой мыши дает точное значение. Не совсем проблема.

Но почему мои скриншоты так далеко? Мое понимание bbox неверно?

...