如何在只知道坐标的情况下在 tkinter canvas 上移动对象?
How to move object on tkinter canvas knowing only its coordinates?
for i in range(random.randint(1,4)):
xos=[150,200,250,300,350,400,450,500,550,600,650,700,750,800,850]
yos=[150,200,250,300,350,400,450,500,550,600,650]
xos_=random.choice(xos)
yos_=random.choice(yos)
object=canvas.create_image(xos_,yos_,image=postava)
read_=read.replace("[","").replace("]","").replace("'","").replace("\n","").replace("\","")
loot.write(read_+"\n")
我在 FOR 中的 canvas 上创建图像,我想在需要时删除它们,但只有最后一个有标签(名称)对象,所以当我输入时:canvas.delete(object)
它只删除最后一个。所以我想知道是否可以删除某个位置的对象(没有名称或标签)。
如果您知道坐标 (coord),则可以删除 canvas 上的对象。使用 item = canvas.find_overlapping(coord)
找到该位置的对象,然后使用 canvas.delete(item)
删除它
参见下面的示例代码:
注意:如果您只知道对象上的一个点,请使用 canvas.find_overlapping(x, y, x, y)
而不是 canvas.find_overlapping(x1, y1, x2, y2)
import Tkinter as tk
import random
root = tk.Tk()
canvas = tk.Canvas(root, width=550, height=500, borderwidth=0)
canvas.pack(expand=True, fill="both")
coord_list=[]
for i in range(random.randint(1,4)):
xos=[150,200,250,300,350,400,450,500]
yos=[150,200,250,300,350,400,450]
xos_=random.choice(xos)
yos_=random.choice(yos)
coord = (xos_,yos_,xos_+50,yos_+50)
coord_list.append(coord)
objectt=canvas.create_rectangle(coord, fill="blue")
canvas.create_rectangle(25, 15, 50, 40, fill="red")
# Delete red rectangle
def delete1(event):
item = canvas.find_overlapping(25, 15, 50, 40)
canvas.delete(item)
# Delete blue rectangles
def delete2(event):
for coord in coord_list:
item = canvas.find_overlapping(*coord)
canvas.delete(item)
#Click on the canvas to delete objects at the coordinates
canvas.bind("<Button-1>", delete1) # change function to delete blue rectangles
root.mainloop()
当然可以。 场景(A)假设我们使用鼠标左键在单击时识别canvas对象,并在释放鼠标左键时删除对象。
第 1 步: 将这些命令包含到 callback/method 中,用于绑定到 Button-1
以删除对象。
mx = canvas.canvasx(event.x) #Translate mouse x screen coordinate to canvas coordinate
my = canvas.canvasy(event.y) #Translate mouse y screen coordinate to canvas coordinate
self.canvasobject = canvas.find_closest(mx, my, halo=5) # get canvas object ID of where mouse pointer is
print(self.canvasobject) #For you to visualize the canvas object number
第 2 步: 将这些命令包含到 callback/method 中,用于绑定到 ButtonRelease-1
以删除对象。
canvas.delete(self.canvasobject) #delete the selected canvas object
场景(B):假设你已经知道对象canvas的x,y坐标,你可以发出一条命令来删除canvas对象:
canvas.delete(canvas.find_closest(x, y, halo=5))
请参阅此 webpage 以了解我使用的 canvas 方法和其他 canvas 方法的说明。
for i in range(random.randint(1,4)):
xos=[150,200,250,300,350,400,450,500,550,600,650,700,750,800,850]
yos=[150,200,250,300,350,400,450,500,550,600,650]
xos_=random.choice(xos)
yos_=random.choice(yos)
object=canvas.create_image(xos_,yos_,image=postava)
read_=read.replace("[","").replace("]","").replace("'","").replace("\n","").replace("\","")
loot.write(read_+"\n")
我在 FOR 中的 canvas 上创建图像,我想在需要时删除它们,但只有最后一个有标签(名称)对象,所以当我输入时:canvas.delete(object)
它只删除最后一个。所以我想知道是否可以删除某个位置的对象(没有名称或标签)。
如果您知道坐标 (coord),则可以删除 canvas 上的对象。使用 item = canvas.find_overlapping(coord)
找到该位置的对象,然后使用 canvas.delete(item)
参见下面的示例代码:
注意:如果您只知道对象上的一个点,请使用 canvas.find_overlapping(x, y, x, y)
而不是 canvas.find_overlapping(x1, y1, x2, y2)
import Tkinter as tk
import random
root = tk.Tk()
canvas = tk.Canvas(root, width=550, height=500, borderwidth=0)
canvas.pack(expand=True, fill="both")
coord_list=[]
for i in range(random.randint(1,4)):
xos=[150,200,250,300,350,400,450,500]
yos=[150,200,250,300,350,400,450]
xos_=random.choice(xos)
yos_=random.choice(yos)
coord = (xos_,yos_,xos_+50,yos_+50)
coord_list.append(coord)
objectt=canvas.create_rectangle(coord, fill="blue")
canvas.create_rectangle(25, 15, 50, 40, fill="red")
# Delete red rectangle
def delete1(event):
item = canvas.find_overlapping(25, 15, 50, 40)
canvas.delete(item)
# Delete blue rectangles
def delete2(event):
for coord in coord_list:
item = canvas.find_overlapping(*coord)
canvas.delete(item)
#Click on the canvas to delete objects at the coordinates
canvas.bind("<Button-1>", delete1) # change function to delete blue rectangles
root.mainloop()
当然可以。 场景(A)假设我们使用鼠标左键在单击时识别canvas对象,并在释放鼠标左键时删除对象。
第 1 步: 将这些命令包含到 callback/method 中,用于绑定到 Button-1
以删除对象。
mx = canvas.canvasx(event.x) #Translate mouse x screen coordinate to canvas coordinate
my = canvas.canvasy(event.y) #Translate mouse y screen coordinate to canvas coordinate
self.canvasobject = canvas.find_closest(mx, my, halo=5) # get canvas object ID of where mouse pointer is
print(self.canvasobject) #For you to visualize the canvas object number
第 2 步: 将这些命令包含到 callback/method 中,用于绑定到 ButtonRelease-1
以删除对象。
canvas.delete(self.canvasobject) #delete the selected canvas object
场景(B):假设你已经知道对象canvas的x,y坐标,你可以发出一条命令来删除canvas对象:
canvas.delete(canvas.find_closest(x, y, halo=5))
请参阅此 webpage 以了解我使用的 canvas 方法和其他 canvas 方法的说明。