Python Tkinter - 如何 return 一个小部件

Python Tkinter - How to return a Widget

我的目标是编写一个程序,插入一个对象(例如一个矩形)
插入后可以使用箭头键移动。
我可以在 canvas 上放置一个矩形,但无法与
交互 矩形,因为我不能 return 来自事件函数的小部件。

所以在这个程序中我可以移动已经在 canvas、
上的矩形 但是当我插入另一个矩形时,我仍在移动第一个矩形。

from tkinter import *

root = Tk()

my_canvas = Canvas(root, width = 500, height = 500, bg = "white")
my_canvas.grid(row = 0, column = 0)

my_object = my_canvas.create_rectangle(50, 150, 250, 50, fill = "red")


def left(event):
  my_canvas.move(my_object, -10, 0)
  
def right(event):
  my_canvas.move(my_object, 10, 0)
  
def up(event):
  my_canvas.move(my_object, 0, -10)
  
def down(event):
  my_canvas.move(my_object, 0, 10)
  
def opamp(event):
  #the following code does not overwrite my_object...
  my_object = my_canvas.create_rectangle(100, 200, 250, 50, fill = "black")
  my_label = Label(root, text = "your mouse is at " + str(event.x) + " " + str(event.y))
  my_label.grid(row = 1, column = 1)
  #returning my_object does not work either

root.bind("<Left>", left)
root.bind("<Right>", right)
root.bind("<Up>", up)
root.bind("<Down>", down)
root.bind("<o>", opamp)


root.mainloop()

您可以在移动函数中使用 tag 代替 .create_rectangle() 返回的项目 ID:

from tkinter import *

ACTIVE = "active"  # tag name for the *active* item

root = Tk()

my_canvas = Canvas(root, width=500, height=500, bg="white")
my_canvas.grid(row=0, column=0)

my_canvas.create_rectangle(50, 150, 250, 50, fill="red", tag=ACTIVE) # make it *active*

def left(event):
  my_canvas.move(ACTIVE, -10, 0)
  
def right(event):
  my_canvas.move(ACTIVE, 10, 0)
  
def up(event):
  my_canvas.move(ACTIVE, 0, -10)
  
def down(event):
  my_canvas.move(ACTIVE, 0, 10)
  
def opamp(event):
  my_canvas.dtag(ACTIVE, ACTIVE) # clear current active tag
  my_canvas.create_rectangle(100, 200, 250, 50, fill="black", tag=ACTIVE) # make it *active*
  #my_label = Label(root, text=f"your mouse is at {event.x} {event.y}")
  #my_label.grid(row=1, column=0)

root.bind("<Left>", left)
root.bind("<Right>", right)
root.bind("<Up>", up)
root.bind("<Down>", down)
root.bind("<o>", opamp)

root.mainloop()