2017-10-17 13 views
1

저는 tkinter를 사용하여 간단한 체스 게임을 쓰고 있습니다. 목표는 시작과 끝 사각형을 클릭하여 Pieces (개체)를 이동하는 것입니다 (좌표 이동하려는 조각과 목적지의 좌표). 그러나 나는 조각이 움직 였다는 것을 보여주기 위해 단추의 텍스트를 업데이트 할 수있는 것 같지 않습니다. 이전 답변/솔루션을 많이 보았습니다. 그러나 보드 (시각적 표현)가 8 x 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 (위)과 같이하는 2 차원 목록으로 게임에서 설정 :

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의 사용은 나를 처음의 좌표를 저장할 수 버튼을 메인 루프의 측면 밖으로 밀었습니다. 두 번째 버튼을 누를 때 나는 move 함수에 대해 두 세트의 좌표를 갖도록이 작업을 수행했습니다.

저는 아직 파이썬과 프로그래밍에 익숙하지 않으므로 잘못하고있는 것이 확실하지 않습니다. 네가 나에게 줄 수있는 도움에 정말 감사한다. 또한 이것은 처음으로 질문을 게시하는 것이므로 조언을 읽었으므로 올바른 장소에 있기를 바랍니다. 이 질문에 문제가있는 경우 알려 주시면 수정하도록 노력하겠습니다. 관련없는 코드를 잘라야합니까? 예를 들어, 버튼의 색상을 흰색에서 검은 색으로 번갈아 버리는 비트.

+0

짧은 대답은 가능합니다. 대부분의 경우 자체 참조 호출과 함께 3D 버튼 배열을 사용하고 다른 측면에서 'text'값을 확인하여 필요한 조치를 결정해야합니다. 그러나 이것은 내게는 이런 종류의 것을 위해 정말로 설계되지 않은 tkinter 라이브러리의 오용과 같은데, [Pygame] (https : // www)와 같이 게임 디자인을 목적으로하는 파이썬 라이브러리가 더 적합합니다. .pygame.org/news). 대체 라이브러리를 사용하면 훨씬 쉽고 편리합니다. –

+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