在tkinter中的按钮上绘制线条

时间:2019-02-15 20:04:48

标签: python-3.x tkinter

我正在开发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中做不到?

1 个答案:

答案 0 :(得分:0)

您不能在已在画布上创建的小部件之上绘制画布对象,或者无法使用packplacegrid在画布顶部添加画布对象。

摘自window items上的tcl / tk规范文档:

  

注意:由于窗口管理方式的限制,无法在窗口项的顶部绘制其他图形项(例如线条和图像)。窗口项始终会遮盖与其重叠的所有图形,无论它们在显示列表中的顺序如何。