我正在开发Tic Tac Toe游戏,以便在我的另一个项目中使用它,但是在尝试为游戏添加一些最终修饰时遇到了问题。我的游戏是使用9个按钮制作的,问题是当一名玩家获胜时,我不知道如何在按钮上画线。我已经设法在想要的位置精确地创建了线条,但是它们总是绘制在按钮下方,因此看不到。
我已经尝试过在按钮上添加边框,但部分起作用,但是问题是当玩家对角线获胜时无法使用它。
这是我的代码:
root = Tk()
root.title("Tic Tac Toe")
root.geometry("250x250")
root.config(bg="white")
canvas = Canvas(root, height=150, width=150, bg="black", highlightthickness=0)
canvas.place(x=50, y=50)
frames = [[]]
buttons = [[]]
这是在画布上创建按钮的功能:
def generategame():
for m in range(3):
frames.append([])
buttons.append([])
for n in range(3):
frames[m].append(Frame(canvas, width=48, height=48))
frames[m][n].propagate(0)
frames[m][n].place(x=(n*51), y=(m*51))
buttons[m].append(Button(frames[m][n], text="", command=lambda i=m, j=n: turn(i, j)))
buttons[m][n].config(bg="white", bd=0)
buttons[m][n].pack(fill=BOTH, expand=1)
这是一段代码,检查玩家是否获胜:
def checkwin(winner):
if buttons[0][0]["text"] == buttons[0][1]["text"] == buttons[0][2]["text"] != "":
print(winner + " WINS")
if buttons[1][0]["text"] == buttons[1][1]["text"] == buttons[1][2]["text"] != "":
print(winner + " WINS")
if buttons[2][0]["text"] == buttons[2][1]["text"] == buttons[2][2]["text"] != "":
print(winner + " WINS")
if buttons[0][0]["text"] == buttons[1][0]["text"] == buttons[2][0]["text"] != "":
print(winner + " WINS")
if buttons[0][1]["text"] == buttons[1][1]["text"] == buttons[2][1]["text"] != "":
print(winner + " WINS")
if buttons[0][2]["text"] == buttons[1][2]["text"] == buttons[2][2]["text"] != "":
print(winner + " WINS")
if buttons[0][0]["text"] == buttons[1][1]["text"] == buttons[2][2]["text"] != "":
print(winner + " WINS")
if buttons[0][2]["text"] == buttons[1][1]["text"] == buttons[2][0]["text"] != "":
print(winner + " WINS")
我尝试做类似的事情,但是它在按钮下面画了一条线:
if buttons[0][0]["text"] == buttons[0][1]["text"] == buttons[0][2]["text"] != "":
canvas.create_line(0, 25, 150, 25)
print(winner + " WINS")
游戏运行良好,但我无法添加最后的效果。我是在做错什么,还是在tkinter中做不到?
答案 0 :(得分:0)
您不能在已在画布上创建的小部件之上绘制画布对象,或者无法使用pack
,place
或grid
在画布顶部添加画布对象。
摘自window items上的tcl / tk规范文档:
注意:由于窗口管理方式的限制,无法在窗口项的顶部绘制其他图形项(例如线条和图像)。窗口项始终会遮盖与其重叠的所有图形,无论它们在显示列表中的顺序如何。