Я использую модуль 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, и, честно говоря, было бы лучше, если бы я знал, что я с ним делаю. При этом любое решение, которое работает, является именно этим; решение, которое работает.
Мне не очень повезло с 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()