2016-07-05 352 views
1

我正在使用tkinter创建一个8x8按钮矩阵,当按下单个按钮时添加到最终列表(例如finalList =((0,0),(5,7),( 6,6),...),允许我快速创建8x8(x,y)坐标图像。我已经创建了带有按钮的窗口,但现在尝试在函数中引用这些按钮以添加到列表甚至改变按钮的颜色tkinter多个按钮颜色变化

我已经读过,一旦按钮被创建,你创建另一个它将移动到该按钮引用我怀疑我需要使用一个字典或二维数组来存储所有这些引用但我正努力想出一个解决方案。

from tkinter import * 

class App: 

    def updateChange(self): 
     ''' 
     -Have the button change colour when pressed 
     -add coordinate to final list 
     ''' 
     x , y = self.xY 
     self.buttons[x][y].configure(bg="#000000") 

    def __init__(self, master): 
     frame = Frame(master) 
     frame.pack() 

     self.buttons = [] # Do I need to create a dict of button's so I can reference the particular button I wish to update? 
     for matrixColumn in range(8): 
      for matrixRow in range(8): 
       self.xY = (matrixColumn,matrixRow) 
       stringXY = str(self.xY) 
       self.button = Button(frame,text=stringXY, fg="#000000", bg="#ffffff", command = self.updateChange).grid(row=matrixRow,column=matrixColumn) 
       self.buttons[matrixColumn][matrixRow].append(self.button) 


root = Tk() 
app = App(root) 
root.mainloop() 

Example of the 8x8 Matrix

回答

1

下面是两个例子,第一个是,如果你只是想改变颜色,没有别的,那么你可以不用使用列表。第二个涉及到使用列表,并演示利希特指出了什么

class App(object): 
    def __init__(self, master): 
     self._master = master 

     for col in range(8): 
      for row in range(8): 
       btn = tk.Button(master, text = '(%d, %d)' % (col, row), bg = 'white') 
       btn['command'] = lambda b = btn: b.config(bg = 'black') 
       btn.grid(row = row, column = col) 

class App(object): 
    def __init__(self, master): 
     self._master = master 
     self._btn_matrix = [] 

     for col in range(8): 
      row_matrix = [] 
      for row in range(8): 
       btn = tk.Button(master, text = '(%d, %d)' % (col, row), bg = 'white', 
           command = lambda x = row, y = col: self.update(x, y)) 
       btn.grid(row = row, column = col) 
       row_matrix.append(btn) 
      self._btn_matrix.append(row_matrix) 

    def update(self, row, col): 
     self._btn_matrix[col][row].config(bg = 'black') 

if __name__ == '__main__': 
    root = tk.Tk() 
    app = App(root) 
    root.mainloop() 
+0

感谢您的帮助,使用了第二个例子,它发挥了魅力。真的很感谢帮助,希望我能自己管理其余的想法。肯定会从中学习! – SgtSafety

0

self.xY在你的双for循环,并没有改变设置为7,7。如果您希望每个按钮都有所不同,您可能需要将updateChange更改为两个参数(x,y),并将它们作为按钮的命令传入; lambda x=matrixColumn y=matrixRow: self.updateChange(x,y)

updateChange

def updateChange(self, x, y): 
    '''...''' 
    self.buttons[x][y].configure(bg="black") 
+0

感谢您的帮助,你完全正确我的self.xY结果是(7,7)。试图这样做时并没有想到聪明! – SgtSafety