2017-12-15 24 views
0

私は学校用のGUIを使ってプログラムを書いています。tkinter 7x7ボタンを作り、クリックすると色が変わります

私はPah Tumと書いています。それは7x7の行列で演奏されます。私のコンソールゲームは完結していますが、今はTkinterと闘っています。

これまでのところ、__init__の機能で定義されたフレームの中にいくつかのフレームがあります。だから今

最初の問題:

私はこのような7x7のボードを作ることができる:

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'はボタンを1つだけ保つことができ、最後のボタンは保持します。 – 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)ではありません。

関連する問題