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()
我的目标是编写一个程序,插入一个对象(例如一个矩形)
插入后可以使用箭头键移动。
我可以在 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()