2017-10-17 15 views
1

私はtkinterを使って単純なチェスゲームを書いています。目的は、開始点と終了点をクリックしてPieces(オブジェクト)を移動することでした(座標移動先の座標、および目的地の座標)を表示します。しかし、私は、ボタンのテキストを更新して作品が移動したことを示すことはできないようです。私は多くの以前の回答/解決策を見てきましたが、ボード(視覚的表現)が8×8ボタンのバンクであるため、個々のボタンを個別に変更/選択する必要があります。チェスゲームで使用するためにtkinterボタンのテキストを更新する方法

ほとんどの場合、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との使用は、私は最初の座標を保存することができますボタンがメインループの側に押し出されます。私はこれを行って、第2のボタンが押されたときに、私は移動機能のための2つの座標のセットを持つようにしました。

私はまだPythonとプログラミング一般に新しいので、私は間違って何をやっているのか分からない。私はあなたが私に与えることができるすべての助けに本当に感謝します。また、これは私の最初の質問を投稿するので、私は助言を読んだので、私は正しい場所にいることを願っています。この質問に問題がある場合は教えてください。それを修正しようとします。無関係なコードをいくつか削除する必要がありますか?たとえば、ボタンの色を白から黒に変えるビット。

+0

短い答えは、はいです。ほとんどの場合、自己参照呼び出しで3次元のボタン配列を使用し、反対側の 'text'値をチェックして必要なアクションを判断する必要があります。しかし、これは私にとっては、このようなことのために実際には設計されていないtkinterライブラリの誤用のように思えますし、[Pygame](https:// www .pygame.org/news)。代替ライブラリを使用すれば、ずっと簡単に時間がかかるでしょう。 –

+0

ありがとう、私はこれが私が望んでいた答えだとは言わないが、私は驚くことではない。私はパイゲームを調べます。再度、感謝します –

答えて

0

私が見つけた1つの方法は、ボタンの作成をプロシージャにして、移動ごとに呼び出す方法です。しかし、これは動作しますが、ボタンを変更するのではなく、ボタンを再作成すると信じられますが、これはうまくいかない可能性があります。誰かが役に立つと思った場合に備えて、ここにコードの変更を掲載します。

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 
関連する問題