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