В главе 20 книги «Автоматизация скучных вещей» есть пример, использующий pyautogui для рисования спирали. Код использует .drag()
для рисования каждого сегмента, но в каждом углу мышь отпускает курсор и начинает новую строку. Это создает разрыв в каждом углу для любого типа кисти, которую вы используете.
Чтобы решить эту эстетическую проблему, я попытался изменить код, чтобы использовать вместо него .mouseDown()
и .move()
. Однако это закончилось тем, что ничего не рисовалось, кроме линии, идущей из верхнего левого угла в нижний левый угол, как если бы каждая итерация цикла while повторяла щелчок.
По тестированию:
while True:
pyautogui.mouseDown()
В mspaint функция .mousedown() действительно работает правильно, когда я сам перемещаю мышь.
Пытающийся:
while True:
pyautogui.mouseDown()
pyautogui.move(300, 0, duration=0.5)
Также правильно рисует линию, но делает это кусками по 300 пикселей. т.е. каждый раз, когда цикл повторялся, сегмент линии загружался в mspaint.
Повторение этого эксперимента в квадрате:
while True:
pyautogui.mouseDown()
pyautogui.move(300, 0, duration=0.5)
pyautogui.move(0, 300, duration=0.5)
pyautogui.move(-300, 0, duration=0.5)
pyautogui.move(0, -300, duration=0.5)
В итоге ничего не нарисовал.
Что здесь происходит? Почему поведение .mouseDown()
такое непоследовательное? Как заставить мой код рисовать красивую непрерывную спираль?
Полный исходный код для справки здесь:
#! python3
# spiralDraw.py - draws a spiral in mspaint
import pyautogui
import time
time.sleep(5) # give time to go to paint app
distance = 300
change = 20
pyautogui.mouseDown()
while distance > 0:
pyautogui.move(distance, 0, duration=0.5)
distance = distance - change
pyautogui.move(0, distance, duration=0.5)
pyautogui.move(-distance, 0, duration=0.5)
distance = distance - change
pyautogui.move(0, -distance, duration=0.5)
if distance == 0:
pyautogui.mouseUp()