Tkinter和UnboundLocalError

时间:2015-06-01 18:46:58

标签: python tkinter

我正在尝试获取棋盘上每个方块的坐标,但是当我点击一个正方形时,错误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()

3 个答案:

答案 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.xself.yclicked()事件将在类本身上,然后它将可以访问它。

答案 2 :(得分:0)

看起来你用过

x = event * x
y = event * y

当你可能想要

x = event.x
y = event.y

后者访问event对象的xy属性,而不是尝试将其乘以未绑定的变量。