from tkinter import *
# Creating the main window
topper = Tk()
topper.geometry('414x417')
topper.resizable(False, False)
topper.configure(bg='green')
# Importing all images that'll be used
b7_img = PhotoImage(file="C:\\project images\\b7.png")
b8_img = PhotoImage(file="C:\\project images\\b8.png")
b9_img = PhotoImage(file="C:\\project images\\b9.png")
b4_img = PhotoImage(file="C:\\project images\\b4.png")
b5_img = PhotoImage(file="C:\\project images\\b5.png")
b6_img = PhotoImage(file="C:\\project images\\b6.png")
b1_img = PhotoImage(file="C:\\project images\\b1.png")
b2_img = PhotoImage(file="C:\\project images\\b2.png")
b3_img = PhotoImage(file="C:\\project images\\b3.png")
bX_img = PhotoImage(file="C:\\project images\\bX.png")
bO_img = PhotoImage(file="C:\\project images\\bO.png")
# This determines if it's player 1's or player 2's turn to give an input
player_turn = False
# This is the function that's supposed to replace/update the image of the designated button on-click
def btn_click(button):
global player_turn
if player_turn:
button(image=bO_img)
player_turn = True
if not player_turn:
button(image=bX_img)
player_turn = False
b7 = Button(topper, height='114', width='115', image=b7_img, command=lambda: btn_click(b7)).place(x=0, y=0)
b8 = Button(topper, height='114', width='115', image=b8_img, command=lambda: btn_click(b8)).place(x=150, y=0)
b9 = Button(topper, height='114', width='115', image=b9_img, command=lambda: btn_click(b9)).place(x=300, y=0)
b4 = Button(topper, height='114', width='115', image=b4_img, command=lambda: btn_click(b4)).place(x=0, y=150)
b5 = Button(topper, height='114', width='115', image=b5_img, command=lambda: btn_click(b5)).place(x=150, y=150)
b6 = Button(topper, height='114', width='115', image=b6_img, command=lambda: btn_click(b6)).place(x=300, y=150)
b1 = Button(topper, height='114', width='115', image=b1_img, command=lambda: btn_click(b1)).place(x=0, y=300)
b2 = Button(topper, height='114', width='115', image=b2_img, command=lambda: btn_click(b2)).place(x=150, y=300)
b3 = Button(topper, height='114', width='115', image=b3_img, command=lambda: btn_click(b3)).place(x=300, y=300)
topper.mainloop()
大家好,我正在尝试使用 Tkinter 创建一个简单的井字游戏,但是我遇到了一个问题,当玩家点击指定按钮时我无法更新它的图像,我不能使用 image
函数更改指定按钮的 btn_click
关键字参数,每当我尝试时,它都会给出 TypeError: 'NoneType' object is not callable
有什么办法可以解决这个问题,而不必为每个按钮创建一个专门的功能?谢谢。
答案 0 :(得分:2)
您的代码存在三个问题:
place()
的结果(始终为 None
)分配给 bX
,例如 b7 = Button(...).place(...)
。您需要将该行分成 2 条语句:b7 = Button(topper, height='114', width='115', image=b7_img, command=lambda: btn_click(b7))
b7.place(x=0, y=0)
b8 = Button(topper, height='114', width='115', image=b8_img, command=lambda: btn_click(b8))
b8.place(x=150, y=0)
b9 = Button(topper, height='114', width='115', image=b9_img, command=lambda: btn_click(b9))
b9.place(x=300, y=0)
b4 = Button(topper, height='114', width='115', image=b4_img, command=lambda: btn_click(b4))
b4.place(x=0, y=150)
b5 = Button(topper, height='114', width='115', image=b5_img, command=lambda: btn_click(b5))
b5.place(x=150, y=150)
b6 = Button(topper, height='114', width='115', image=b6_img, command=lambda: btn_click(b6))
b6.place(x=300, y=150)
b1 = Button(topper, height='114', width='115', image=b1_img, command=lambda: btn_click(b1))
b1.place(x=0, y=300)
b2 = Button(topper, height='114', width='115', image=b2_img, command=lambda: btn_click(b2))
b2.place(x=150, y=300)
b3 = Button(topper, height='114', width='115', image=b3_img, command=lambda: btn_click(b3))
b3.place(x=300, y=300)
您需要在 button.config(image=...)
函数中使用 image
更改 button(image=...)
选项而不是 btn_click()
。
您为 player_turn
分配了错误的值(当它已经是 True
时分配 True
,当它已经是 False
时分配 False
)。< /p>
更新了 btn_click()
函数:
def btn_click(button):
global player_turn
if player_turn:
button.config(image=bO_img)
else:
button.config(image=bX_img)
player_turn = not player_turn
我认为按钮在点击后应该被禁用,这样就不能再次点击了。