Используя turtle.drag для записи перетаскиваемых точек, затем turtle.release для запуска кода, основанного на этих?

1

Я использую модуль Python Turtle, чтобы позволить пользователю рисовать изображения (относительно низкого разрешения). Я хочу, чтобы пользователь мог нажимать и перетаскивать изображение на экране. Цель состоит в том, чтобы нарисовать изображение в градациях серого 28x28. У меня уже есть необходимый код для рисования изображения (хранится в простой матрице для удобства обработки).

Я могу рисовать с помощью функции turtle.onscreenclick(). Точно так же я все еще могу рисовать, используя turtle.ondrag(), но это абсурдно запаздывает и пропускает по экрану, если я постоянно перерисовываю свое изображение.
Мое решение состоит в том, чтобы ondrag() сохранял все точки, к которым он обращается, в массиве кортежей. Вот где у меня проблемы. План состоит в том, чтобы использовать этот массив, чтобы затем обновлять матрицу-пустышку и обновлять экран только после перетаскивания (или каждый здесь и там для лучшей плавности).

def click(x, y):
    tim.goto(0, 0)
    updateArray(x,y) ##Updates the numpy array
    ##Refresh the screen
    tim.clear()
    drawArr(arr)#Draws the screen with the new array
    turtle.update()
dragArr = []
def drag(x, y):
    print("Dragging; X:", x, "Y:", y)
    dragArr.append((x, y))
def release(x, y):
    print(dragArr)
    for x, y in dragArr:
        print("X:", x, "Y:", y)
        updateArray(x,y)
    dragArr = []
    tim.clear()
    drawArr
    turtle.update()
drawArr(arr)
tim.goto(200, 0)
tim.color((128, 128, 128))
turtle.update()
tim.shapesize(stretch_wid = 10000, stretch_len = 10000) #Make the turtle larger for the sake of tim.ondrag(), 
#as it only works when you actually click on the turtle; eventually the turtle will be invisible

tim.showturtle()
tim.goto(0, 0)
turtle.update()
turtle.onscreenclick(click, 1, True)
turtle.onrelease(release, 1, True)
tim.ondrag(drag, 1, True)

Цель состоит в том, чтобы сделать две вещи; Нарисуйте исходное изображение из массива NumPy, а затем нарисуйте поверх него. В итоге я получаю, что функция ondrag() вызывает нормально; он печатает все пиксели попадания в консоли. Однако функция onrelease никогда не вызывается, и в консоли ничего не печатается.

Черепаха явно не требуется, хотя изначально она, казалось, прекрасно подходила для этой задачи. Изначально я работал с matplotlib, и, честно говоря, было бы лучше, если бы я знал, что я с ним делаю. При этом любое решение, которое работает, является именно этим; решение, которое работает.

Теги:
python-3.x
python-3.7
events
turtle-graphics

1 ответ

0

Мне не очень повезло с onrelease поэтому я буду игнорировать это. Тот факт, что вы делаете свою черепаху огромной для перетаскивания, означает, что вы действительно хотите перетаскивание экрана, а не перетаскивание черепахи. К сожалению, черепаха не обеспечивает этого. Но он построен на вершине tkinter, поэтому мы добавим его к черепахе.

Ваш пример кода неполон, содержит ошибки и поэтому не может быть запущен. Ниже приведен пример некоторых методов, которые могут оказаться полезными на основе вашего примера кода:

from turtle import Screen, Turtle
from functools import partial

def onscreenmove(self, fun, btn=1, add=None):  # method missing from turtle.py

    if fun is None:
        self.cv.unbind('<Button%s-Motion>' % btn)
    else:
        def eventfun(event):
            fun(self.cv.canvasx(event.x) / self.xscale, -self.cv.canvasy(event.y) / self.yscale)

        self.cv.bind('<Button%s-Motion>' % btn, eventfun, add)

def updateArray(x, y):
    array.append((x, y))

def drag(x, y):
    screen.onscreenmove(None)
    updateArray(x, y)
    drawArr()
    screen.onscreenmove(drag)

def click(x, y):
    screen.onscreenclick(None)
    updateArray(x, y)
    drawArr()
    screen.onscreenclick(click)

def drawArr():
    tim.clear()

    for position in array:
        tim.setposition(position)
        tim.pendown()

    tim.penup()

    screen.update()

array = [(100, -57.7), (0, 115.5), (-100, -57.7), (100, -57.7)]  # triangle initial drawing

screen = Screen()
screen.onscreenmove = partial(onscreenmove, screen)  # install missing method

tim = Turtle()
tim.penup()

screen.onscreenmove(drag)
screen.onscreenclick(click)

drawArr()

screen.tracer(False)

screen.mainloop()

Изображение 174551

Ещё вопросы

Сообщество Overcoder
Наверх
Меню