如何更新用于国际象棋游戏的tkinter按钮文本

时间:2017-10-17 10:58:02

标签: python tkinter chess

我正在使用tkinter编写一个简单的国际象棋游戏,其目的是通过单击开始和结束方块(选择要移动的棋子的坐标以及目标的坐标)来移动棋子(对象)。但是,我似乎无法更新按钮的文本以显示碎片已移动。我已经看了一些以前的答案/解决方案,但是大多数都需要单独更改/选择每个按钮,这是我无法做到的,因为电路板(可视化表示)是一组8×8按钮。

大多数人建议使用tkinters StringVar()但是我似乎无法让它工作。

我想我的问题是如何在移动后更新按钮。

['WR', 'WN', 'WB', 'WK', 'WQ', 'WB', 'WN', 'WR'] row 1
['WP', 'WP', 'WP', 'WP', 'WP', 'WP', 'WP', 'WP']
[None, None, None, None, None, None, None, None]
[None, None, None, None, None, None, None, None]
[None, None, None, None, None, None, None, None]
[None, None, None, None, None, None, None, None]
['BP', 'BP', 'BP', 'BP', 'BP', 'BP', 'BP', 'BP']
['BR', 'BN', 'BB', 'BK', 'BQ', 'BB', 'BN', 'BR'] row 7

Board_visual在游戏中设置为2d列表,如下所示(上图):

import game
from tkinter import *
from functools import partial
first=True

main=Tk()
main.title("TEST")
main.geometry("1000x1000")
buttonframe=Frame(main)
buttonframe.grid(row=0,column=0)
index=0
colour="white"
for i in game.board_visual:
    index2=0
    for j in i:
        if j==None:
            j=""
        buttontext=StringVar()
        buttontext.set(j)
        Button(buttonframe, textvariable=buttontext,fg="red",command=lambda row=index,column=index2: move(row,column),font=30, width=10,height=2,bg=colour,).grid(row=index, column=index2, sticky=W)
        if colour=="white":
            colour="black"
        elif colour=="black":
            colour="white"
        index2=index2+1
    if colour=="white":
        colour="black"
    elif colour=="black":
        colour="white"
    index=index+1

def move(row,column):
    global first
    if first==True:
        first=False
        global startx
        global starty
        startx=row
        starty=column
    else:
        endx=row
        endy=column
        first=True
        game.board[startx][starty].move(endx,endy)
        game.update(game.board,game.board_visual)

        update()
def update():
    index=0
    for i in game.board_visual:
        index2=0
        for j in i:
            buttontext.set(j)
            index2=index2+1
    index=index+1
main.mainloop()

使用全局startx和starty允许我存储主循环中压出的第一个按钮的坐标。我已经这样做了,当按下第二个按钮时,我有两组移动功能的坐标。

我仍然是python和编程的新手,所以我不确定我做错了什么。我非常感谢你能给我的任何帮助。这也是我第一次发帖提问,所以我已经阅读了这些建议,所以我希望自己能够找到合适的位置。如果这个问题有问题,请告诉我,我会尽力纠正。我应该删掉一些不相关的代码吗?例如,导致按钮颜色从白色变为黑色的位。

1 个答案:

答案 0 :(得分:0)

我发现的一种方法是将按钮创建一个过程并在每次移动后调用它。这可行,但我相信它只是重新创建按钮而不是更改它们,这可能是一个糟糕的解决方案,但它确实有效。我会在这里发布代码更改,以防有人发现它有用。

def button_text_change():
    index=0
    colour="white"
    for i in game.board_visual:
        index2=0
        for j in i:
            if j==None:
                j=""
            buttontext=StringVar()
            buttontext.set(j)
            Button(buttonframe, textvariable=buttontext,fg="red",command=lambda row=index,column=index2: move(row,column),font=30, width=10,height=2,bg=colour,).grid(row=index, column=index2, sticky=W)
            if colour=="white":
                colour="black"
            elif colour=="black":
                colour="white"
            index2=index2+1
        if colour=="white":
            colour="black"
        elif colour=="black":
            colour="white"
        index=index+1