Python 绑定/事件给出错误';int';对象没有属性';绑定&x27;

Python 绑定/事件给出错误';int';对象没有属性';绑定&x27;,python,tkinter,tkinter-canvas,Python,Tkinter,Tkinter Canvas,我试图理解绑定和事件在python中是如何工作的。例如,我创建了3个瓷砖,希望能够更改其中一个瓷砖的颜色,但无法理解或找出哪里出了问题。我不断得到: AttributeError: 'int' object has no attribute 'bind'. 以下是代码,请提前感谢: import tkinter def main(): root = tkinter.Tk() title = tkinter.Label(root, text="Test Window")

我试图理解绑定和事件在python中是如何工作的。例如,我创建了3个瓷砖,希望能够更改其中一个瓷砖的颜色,但无法理解或找出哪里出了问题。我不断得到:

AttributeError: 'int' object has no attribute 'bind'.
以下是代码,请提前感谢:

import tkinter

def main():

    root = tkinter.Tk()

    title = tkinter.Label(root, text="Test Window")
    title.pack()


    canvas= tkinter.Canvas(root, background='green', width = 300, height = 300)

    tile1=canvas.create_rectangle(0, 0, 100, 100, fill = 'magenta')
    tile2=canvas.create_rectangle(100,0, 200,100, fill = 'blue')
    tile3=canvas.create_rectangle(200,0, 300,100, fill = 'blue')

    canvas.pack()

    def change_square(event):
        event.configure(background = 'blue')

    tile1.bind("<Button-1>", change_square(tile1))

    root.mainloop()

if __name__ == '__main__':
    main()
导入tkinter
def main():
root=tkinter.Tk()
title=tkinter.Label(根,text=“测试窗口”)
title.pack()
canvas=tkinter.canvas(根,背景为绿色,宽度为300,高度为300)
tile1=画布。创建一个矩形(0,0,100,100,fill='magenta')
tile2=画布。创建一个矩形(100,0200100,填充='蓝色')
tile3=canvas.create_矩形(200,0300100,fill='blue')
canvas.pack()
def更改方格(事件):
配置(背景='blue')
tile1.bind(“,change_square(tile1))
root.mainloop()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

项目配置
将更改颜色:

def main():
    root = tkinter.Tk()

    title = tkinter.Label(root, text="Test Window")
    title.pack()

    canvas = tkinter.Canvas(root, background='green', width=300, height=300)

    s1 = canvas.create_rectangle(0, 0, 100, 100, fill='magenta')

    s2 = canvas.create_rectangle(100, 0, 200, 100, fill='blue')
    s3 = canvas.create_rectangle(200, 0, 300, 100, fill='blue')

    canvas.pack()

    def change_square(event):
        canvas.itemconfigure(s1, fill="blue")

    canvas.bind("<Button-1>", change_square)
    root.mainloop()
等等

如果要根据单击的内容更改颜色,则此操作应有效:

 def change_square(event):
        x = canvas.canvasx(event.x)
        y = canvas.canvasy(event.y)
        sq = canvas.find_closest(x,y)[0]
        canvas.itemconfigure(sq, fill="black")


    canvas.bind("<Button-1>", change_square)
    root.mainloop()
def change_square(事件):
x=canvas.canvasx(event.x)
y=canvas.canvasy(event.y)
sq=画布。查找最近的(x,y)[0]
canvas.itemconfigure(sq,fill=“黑色”)
canvas.bind(“,change\u square)
root.mainloop()

iCodez在删除其评论之前实际上已经解决了这个问题。我试图真正掌握的是如何为特定事件选择tile1、tile2或tile3,这就是为什么我做了这么多疯狂的事情,试图将tile1作为参数传递,等等,我会看看你的链接。。谢谢…谢谢帕德雷克。这更接近我想要的答案。考虑到上面的代码,我如何让s2改变?我尝试添加canvas.itemconfigure(s2,fill=“red”)以查看单击s2时发生的情况。它最终改变了s1和s2的颜色。是否可以单独选择它们并单独更改颜色。这就是为什么我试图弄清楚是否可以将s1、s2或s3对象作为change_square中的参数传递。“我希望我说得有道理。”林兹勒,我来看看你提到的另一个问题。再次感谢你们的努力,伙计们。我会试着自己解决这个问题,如果我陷入困境,我会问另一个问题。现在,虽然你的回答让我离帕德雷克更近了一步,所以谢谢你@Cosi,当您单击时,它应该只更改一项,无论您指定哪一项。您基本上希望单击画布的各个部分,然后更改颜色?您可以使用
tag_bind
方法FWIW将绑定附加到各个画布项目。这将允许您设置单独的绑定,并使用lambda或functools.partial将项id作为回调的一部分传递。您的最新编辑可以使用Padraic。我真的要去看看。。。他们太多了,我在这里一无所知。
 def change_square(event):
        x = canvas.canvasx(event.x)
        y = canvas.canvasy(event.y)
        sq = canvas.find_closest(x,y)[0]
        canvas.itemconfigure(sq, fill="black")


    canvas.bind("<Button-1>", change_square)
    root.mainloop()