Tkinter .bind()方法

时间:2016-04-14 02:54:09

标签: python tkinter bind

我试图制作一个井字游戏,但每次运行该程序时,该功能都会因某种原因自动执行。代码到目前为止:

from tkinter import *

root = Tk()
root.geometry('200x200')

x_turn = True

def button_clicked(b):
    global x_turn
    print('Executed')
        if x_turn is True:
            b.config(text='X')
            x_turn = False
        else:
            b.config(text='O')
            x_turn = True

button1 = Button(root, text='', width=6, height=2)
button1.bind('<Button1>', button_clicked(button1))
button1.grid(row=0, column=0)

button2 = Button(root, text='', width=6, height=2)
button2.bind('<Button1>', button_clicked(button2))
button2.grid(row=0, column=1)

button3 = Button(root, text='', width=6, height=2)
button3.bind('<Button1>', button_clicked(button3))
button3.grid(row=0, column=2)

button4 = Button(root, text='', width=6, height=2)
button4.bind('<Button1>', button_clicked(button4))
button4.grid(row=1, column=0)

button5 = Button(root, text='', width=6, height=2)
button5.bind('<Button1>', button_clicked(button5))
button5.grid(row=1, column=1)

button6 = Button(root, text='', width=6, height=2)
button6.bind('<Button1>', button_clicked(button6))
button6.grid(row=1, column=2)

button7 = Button(root, text='', width=6, height=2)
button7.bind('<Button1>', button_clicked(button7))
button7.grid(row=2, column=0)

button8 = Button(root, text='', width=6, height=2)
button8.bind('<Button1>', button_clicked(button8))
button8.grid(row=2, column=1)

button9 = Button(root, text='', width=6, height=2)
button9.bind('<Button1>', button_clicked(button9))
button9.grid(row=2, column=2)

root.mainloop()

当我运行程序时,它会自动调用该函数9次,我无法弄清楚原因。是否有一些我不知道的奇怪规则?

1 个答案:

答案 0 :(得分:1)

它会自动拨打button_clicked 9次,因为您告诉它使用9次buttonX.bind...来电拨打9次。

bind method将函数作为参数。你没有传递一个函数,你传递了button_clicked(b)的返回值。

[button_clicked是一个函数,但button_clicked(some_parameter)表示调用该函数,并使用返回值作为参数]

有几种方法可以传递一个将参数带到bind方法的函数。一种方法是传入一个匿名lambda expression,它会在调用real函数时调用它。

所以,而不是:

button1.bind('<Button1>', button_clicked(button1))

将所有通话更改为以下内容:

button1.bind('<Button1>', lambda: button_clicked(button1))