当前位置: 首页 > 知识库问答 >
问题:

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

贺英悟
2023-03-14

我正在用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()

全局starx和starty的使用允许我存储主循环一侧按下的第一个按钮的坐标。我这样做是为了当按下第二个按钮时,我有两组移动功能的坐标。

我对python和编程还是个新手,所以我不确定自己做错了什么。我真的很感激你能给我的任何帮助。这也是我第一次发布一个问题,所以我已经阅读了建议,所以我希望我在正确的地方。如果这个问题有问题,请告诉我,我会尽力纠正。我应该删掉一些不相关的代码吗?e、 g使按钮颜色从白色变为黑色的位。

共有1个答案

阎承嗣
2023-03-14

我发现的一个解决方案是创建一个函数来更改按钮,并在每次移动后调用它。这是有效的;但是,我认为它创建了新的按钮,而不是更改现有的按钮,这可能是一个糟糕的解决方案。我会把代码贴在这里,以防有人觉得有用。

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 
 类似资料:
  • 本文向大家介绍Javafx实现国际象棋游戏,包括了Javafx实现国际象棋游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Javafx实现国际象棋游戏的具体代码,供大家参考,具体内容如下 基本规则 棋子马设计“日”的移动方式 兵设计只能向前直走,每次只能走一格。但走第一步时,可以走一格或两格的移动方式 请为后设计横、直、斜都可以走,步数不受限制,但不能越子的移动方式。 车只能横向

  • 我刚刚学习了Android和Java编程(里面非常noob),我想问一些关于Android编程和Socket服务器的问题。 我得到一个任务,创建一个简单的国际象棋应用程序(不包括AI),棋子的位置将从TCP套接字中检索: 服务器:xinuc.org 端口:7387 我被告知使用Socket Persistent,因为服务器会在每秒更新典当的位置,典当的位置将以这种格式发送 [卒典][横位][竖位]

  • 上面的代码显示了一个可以上下移动的部分的示例。这不是一个有效的棋步。所以,如果我要移动一个皇后,我该怎么做呢?我们只是假设我们已经有了一个矩阵(x,y)8×8的板。

  • 我目前正在创建一个国际象棋游戏,包括以下几个类: ChessPiece-对于所有不同的棋子,由一个Movement行为实例变量组成 移动行为-接口实现的当铺移动行为,KingMovement行为等类,以定义如何每个片类型移动 ChessBoard-由ChessPiece[][] 2D数组组成,具有addPiece()/RemvePiece()/replace ePiece()等功能 玩家-小班帮助

  • 问题内容: 我试图做到这一点,以便当用户单击一个按钮时,它变为“ X”或“ 0”(取决于他们的团队)。如何使按钮上的文本更新?到目前为止,我最好的主意是删除按钮,然后再次打印它们,但这只能删除一个按钮。这是我到目前为止的内容: 问题答案: 就像您的标签一样,按钮小部件也有一个选项。您可以用来更新按钮。最小示例:

  • DreamChess 是一款开放源码、跨平台(可在 Windows、Mac OS X 及 Linux 上运行)的 3D 国际象棋游戏。该游戏包含自身的引擎 Dreamer,提供各种国际象棋棋盘,并具有背景音乐及声效等其他附属功能。