Новичок на питоне. Я написал программу, которая позволяет пользователю создавать скриншот, используя только мышь с 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 неверно?