我正在尝试获取棋盘上每个方块的坐标,但是当我点击一个正方形时,错误UnboundLocalError: local variable 'x' referenced before assignment
会一直显示。
import tkinter
class RA:
def __init__(self):
self._columns = 8
self._rows = 8
self._root = tkinter.Tk()
self._canvas = tkinter.Canvas(master = self._root,
height = 500, width = 500,
background = 'green')
self._canvas.pack(fill = tkinter.BOTH, expand = True)
self._canvas.bind('<Configure>',self.draw_handler)
def run(self):
self._root.mainloop()
def draw(self):
self._canvas.create_rectangle(0,0,250,250,fill = 'blue',outline = 'white')
self._canvas.create_rectangle(250,250,499,499,fill = 'red',outline = 'white')
self._canvas.create_rectangle(499,499,250,250,fill = 'black',outline = 'white')
#
for c in range(self._columns):
for r in range(self._rows):
x1 = c * (column_width)#the width of the column
y1 = r * (row_height)
x2 = x1 + (column_width)
y2 = y1 + (row_height)
#3-5
def clicked(self,event: tkinter.Event):
x = event * x
y = event * y
rect = self._canvas.find_closest(x,y)[0]
coordinates = self._canvas.gettags(rect)
print(coordinates[0],coordinates[1])
def draw(self):
self._canvas.delete(tkinter.ALL)
column_width = self._canvas.winfo_width()/self._columns
row_height = self._canvas.winfo_height()/self._rows
for x in range(self._columns):
for y in range(self._rows):
x1 = x * column_width
y1 = y * row_height
x2 = x1 + column_width
y2 = y1 + row_height
r = self._canvas.create_rectangle(x1,y1,x2,y2,fill = 'blue')#,tag = (x,y))# added for the second time,
self._canvas.tag_bind(r,'<ButtonPress-1>',self.clicked)
self._canvas.create_rectangle(x1,y1,x2,y2)
self._canvas.bind('<Configure>',self.draw_handler)
def draw_handler(self,event):
self.draw()
r = RA()
r.run()
答案 0 :(得分:1)
问题在于以下两行:
def clicked(self,event: tkinter.Event):
x = event * x
您在表达式的右侧使用x
,但x
未在任何地方定义。此外,您将遇到问题,因为event
是一个对象。将对象乘以其他一些数字不太可能按照您的想法进行。您是否打算在表达式中使用event.x
而不是event * x
?
获取所点击商品的坐标
即使您明确询问了未绑定的局部变量错误,但您似乎正在尝试获取所单击项目的坐标。 Tkinter自动提供在标签"current"
上单击的项目,您可以使用该项目来获取坐标:
coordinates = self._canvas.coords("current")
来自官方tk文档:
标签电流由Tk自动管理;它适用于 当前项目,是绘制区域覆盖的最顶层项目 鼠标光标的位置(不同的项目类型解释了这一点 各种方式;有关详细信息,请参阅各个项目类型文档 如果鼠标不在画布小部件中或者不在项目上,则 没有项目有当前标记。
答案 1 :(得分:0)
y
也会发生这种情况。如果您希望x
与按钮一起存储,则需要为其创建一个类,并将其存储为self.x
和self.y
。 clicked()
事件将在类本身上,然后它将可以访问它。
答案 2 :(得分:0)
看起来你用过
x = event * x
y = event * y
当你可能想要
时x = event.x
y = event.y
后者访问event
对象的x
和y
属性,而不是尝试将其乘以未绑定的变量。