Есть ли способ визуально показать, где я щелкнул, используя Python. Подобно нажатию CTRL на Windows и просмотру кругов - PullRequest
0 голосов
/ 26 мая 2020

В настоящее время моя программа открывает изображение, и с помощью этого изображения вы можете щелкнуть в любом месте на нем, и оно вернет координаты пикселей того места, где вы щелкнули. И по этим координатам вы можете ввести текст, и он вернет вам отредактированное изображение. Тем не менее, мне было интересно, есть ли способ, который был бы визуально полезен для пользователя, показывая им, где они нажимали. Вот мой текущий код для открытия изображения и щелчка по нему, чтобы вернуть координаты. Я использую tkinter и знаю, что мне следовало отказаться от импорта tkinter *, но сейчас уже слишком поздно: /.

    ### Function to open files ###
img_window = tkinter.PanedWindow(top, orient='vertical')
def file_opener():

    global actual_img
    global original_img

    top.filename = filedialog.askopenfilename(initialdir="*/Images/", title ="Select an Image", filetypes=((".png", "*.png"),(".jpg", "*.jpg")))

    original_img = Image.open(top.filename)

    #################### CLICK LOCATION OF WHERE YOU WANT TO ADD TEXT ####################

    event2canvas = lambda e, c: (c.canvasx(e.x), c.canvasy(e.y))

    imgApp = tkinter.Toplevel()

    # creating an img var of my original image
    img = ImageTk.PhotoImage(original_img)

    #setting up a tkinter canvas with scrollbars
    frame = tkinter.Frame(imgApp, bd=2, relief=tkinter.SUNKEN)
    frame.grid_rowconfigure(0, weight=1)
    frame.grid_columnconfigure(0, weight=1)
    xscroll = tkinter.Scrollbar(frame, orient=tkinter.HORIZONTAL)
    xscroll.grid(row=1, column=0, sticky=tkinter.E+tkinter.W)
    yscroll = tkinter.Scrollbar(frame)
    yscroll.grid(row=0, column=1, sticky=tkinter.N+tkinter.S)
    canvas = tkinter.Canvas(frame, bd=0, xscrollcommand=xscroll.set, yscrollcommand=yscroll.set, width = img.width(), height = img.height())
    canvas.grid(row=0, column=0, sticky=tkinter.N+tkinter.S+tkinter.E+tkinter.W)
    xscroll.config(command=canvas.xview)
    yscroll.config(command=canvas.yview)
    frame.pack(fill=tkinter.BOTH, expand = 1)

    # adding the image to canvas

    canvas.create_image(0,0,image=img,anchor="nw")
    canvas.config(scrollregion=canvas.bbox(tkinter.ALL))

    #function to be called when mouse is clicked
    def returncoords(event):
        global cx, cy
        #outputting x and y coords to console
        cx, cy = event2canvas(event, canvas)
        return cx, cy


    #mouseclick event
    canvas.bind("<ButtonPress-1>", returncoords)
    # canvas.bind("<ButtonRelease-1>", returncoords)

    imgApp.title("Please select an area on Image")
    imgApp.config(bg="red")
    imgApp.mainloop()

1 Ответ

0 голосов
/ 26 мая 2020

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

canvas.create_image(0,0,image=img,anchor="nw")
    canvas.config(cursor = "tcross")
    canvas.config(scrollregion=canvas.bbox(tkinter.ALL))

    # function to be called when mouse is clicked
    def returnCoords(event):
        global cx, cy
        # change the cursor when button is held / click so user knows they selected a coordinate
        canvas.config(cursor = "dotbox")
        cx, cy = event2canvas(event, canvas)
        return cx, cy

    def returnCursor(event):
        canvas.config(cursor = "arrow")
        time.sleep(.7)
        imgApp.destroy()

    # mouseclick event / release
    canvas.bind("<ButtonPress-1>", returnCoords)
    canvas.bind("<ButtonRelease-1>", returnCursor)
...