bagaimana cara memilih banyak objek dengan mouse di tkinter python gui?

Saya mencoba memilih beberapa objek menggunakan mouse seperti di windows, klik dan seret. saya menggunakan tkinter dengan python untuk membangun gui ini. saya membuat objek seperti yang ditunjukkan pada kode di bawah ini.

import Tkinter as tk
from Tkinter import *

root = Tk()
w= Canvas(root, width=800, height=768)
w.grid()
w.create_line(200,200,300,300, width=3, tags="line1")
w.create_oval(150,100,170,300, fill="red", tags="oval")

mainloop()

apa yang saya coba lakukan adalah jika saya menyeret mouse saya ke beberapa objek, beberapa def akan mengembalikan tag objek tersebut. bagaimana saya bisa melakukan ini.

Terima kasih


person lokesh    schedule 01.04.2013    source sumber


Jawaban (2)


Simpan koordinat pada acara button-down, dan kemudian pada acara button-up gunakan find_enclosed atau find_overlapping metode kanvas untuk menemukan semua item yang dicakup oleh wilayah tersebut.

person Bryan Oakley    schedule 01.04.2013

Kode berikut merender persegi panjang yang mengikuti kursor dan mengembalikan daftar ID elemen elemen dalam persegi panjang. Ia menggunakan pengikatan saat mouse ditekan di dalam kanvas, saat bergerak, dan saat dilepaskan. Saya kemudian menyimpan daftar elemen dengan pengidentifikasi kanvasnya dan menggunakannya untuk mencadangkan pencarian objek dari daftar ID yang dipilih.

# used to record where dragging from
originx,originy = 0,0

canvas.bind("<ButtonPress-1>", __SelectStart__)
canvas.bind("<B1-Motion>", __SelectMotion__)
canvas.bind("<ButtonRelease-1>", __SelectRelease__)

# binding for drag select
def __SelectStart__(self, event):
    oiginx = canvas.canvasx(event.x)
    originy = canvas.canvasy(event.y)
    selectBox = canvas.create_rectangle(originx,originy,\
        originx,originy)

# binding for drag select
def __SelectMotion__(self, event):
    xnew = canvas.canvasx(event.x)
    ynew = canvas.canvasy(event.y)
    # correct cordinates so it gives (upper left, lower right)
    if xnew < x and ynew < y:
        canvas.coords(selectBox,xnew,ynew,originx,originy)
    elif xnew < x:
        canvas.coords(selectBox,xnew,originy,originx,ynew)
    elif ynew < y:
        canvas.coords(selectBox,originx,ynew,xnew,originy)
    else:
        canvas.coords(selectBox,originx,originy,xnew,ynew)

# binding for drag select
def __SelectRelease__(self, event):
    x1,y1,x2,y2 = canvas.coords(selectBox)
    canvas.delete(selectBox)
    # find all objects within select box
    selectedPointers = []
    for i in canvas.find_withtag("tag"):
        x3,y3,x4,y4 = canvas.coords(i)
        if x3>x1 and x4<x2 and y3>y1 and y4<y2:
            selectedPointers.append(i)
    Callback(selectedPointers)

# function to receive IDs of selected items
def Callback(pointers):
    print(pointers)
person cweb    schedule 06.07.2021