2017-12-15 13 views
0

학교용 GUI가있는 프로그램을 작성하고 있습니다.tkinter 7x7 버튼을 만들고 클릭 할 때 색상이 변경됩니다.

나는 Pah Tum이라고 써야합니다. 7x7 매트릭스로 재생됩니다. 내 콘솔 게임은 끝났고 완벽하게 작동하지만, 지금은 Tkinter와 어려움을 겪고 있습니다.

지금까지 프레임 내에서 내 __init__ 함수에 정의 된 프레임이 몇 개 있습니다. 그래서 지금

첫 번째 문제 :

나는이 같은 7 × 7 보드를 만들 수 :

for x in range(0, 7): 
    for y in range(0, 7): 
      self.button = Button(self.board, command=self.action) 
      self.button.grid(row = x, column = y) 

을 내가 지금하고 싶은 그래서, 나는 버튼을 누를 때마다이 난을 변경하려면 붉은 색 (플레이어 1의 경우) 또는 파랑 (플레이어 2의 경우).

self.turn_tracker = 0 # is in __init__ 

def action(self): 
    if self.turn_tracker in range(0, 49, 2): 
     self.turn_tracker += 1 
     self.button.configure(bg="blue") 

    elif self.turn_tracker in range(1, 49, 2): 
     self.turn_tracker += 1 
     self.button.configure(bg="red") 

    elif self.turn_tracker == 49: 
     print("game over") 
     sys.exit() #calculate 

이렇게하면 6x6에서 버튼이 변경됩니다. 그래서 내가 시도한 것은 모든 버튼을 개별적으로 정의하고 모든 버튼에 대한 변경 방법을 별도로 가지고있는 것입니다. 상상할 수 있듯이 이것은 정말로보기 흉한 것처럼 보이지만 적어도 작동합니다.

더 효율적으로 만들려면 어떻게해야합니까? 어떤 도움을 주셔서 감사합니다!

+0

어제는 7x7 격자의 빨간 버튼과 비슷한 질문이었습니다 : [Python Tkinter - 버튼이있는 사전 - 어떻게 비활성화합니까?] (https://stackoverflow.com/questions/47821717/python-tkinter-dictionary-with- 버튼 - 어떻게 - 당신 - 비활성화 - 그들) – furas

+0

목록에 버튼을 유지해야합니다. 'self.button'은 하나의 버튼만을 유지할 수 있으며 마지막 버튼을 유지합니다. – furas

+0

그는 동일한 작업을해야합니다. 나는 그것을 볼 것이다, 고마워! – Marcel

답변

0

버튼을 루프로 정의하고 서로 다른 명령을 연결할 수 있습니다. 내가 lambda row=x, column=y: self.action(row, column)를 사용

self.buttons = [] 
    for x in range(0, 7): 
     self.buttons.append([]) 
     for y in range(0, 7): 
      button = tk.Button(self.board, command=lambda row=x, column=y: self.action(row, column)) 
      self.buttons[x].append(button) 
      button.grid(row=x, column=y) 

으로 __init__에 생성됩니다

def action(self, x, y): 
    if self.turn_tracker in range(0, 49, 2): 
     self.turn_tracker += 1 
     self.buttons[x][y].configure(bg="blue") 

    elif self.turn_tracker in range(1, 49, 2): 
     self.turn_tracker += 1 
     self.buttons[x][y].configure(bg="red") 

    elif self.turn_tracker == 49: 
     print("game over") 

그리고 버튼의 매트릭스 : 예를 들어 당신은 행과 열 인수로 걸릴 7 × 7 매트릭스 self.buttons에있는 버튼을 저장하고 action을 만들 수 있습니다 루프 x=6y=6의 끝에서 버튼을 클릭하면 바뀌는 마지막 버튼의 색상이됩니다 (Tkinter assign button command in loop with lambda 참조). lambda: self.action(x, y)이 아니기 때문에 직접 적용하지 마십시오.