我试图制作一个井字游戏,但每次运行该程序时,该功能都会因某种原因自动执行。代码到目前为止:
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次,我无法弄清楚原因。是否有一些我不知道的奇怪规则?
答案 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))