为什么我不能改变按钮的颜色?

时间:2014-12-14 17:22:07

标签: python function tkinter call

我正在编写Samegame作为我使用Tkinter学习Python的项目。 case是一个2个字符的代码,用于标识我板上点击的方块(例如A9)

此功能:

l =(nb_ligne, nb_colonne, nb_couleurs, self.matrice_numbers, self.matrice_cellules)
def suppr_graph( l, case):
    for i in range(0, l[0]) :
        for j in range(0, l[1]) :
            if l[3][i][j] == case :
                couleur = l[4][i][j]
                l[4][i][j] = "X"
                verif_graph(l,i,j,couleur)
    for i in range(0, l[0]) :
        for j in range(0, l[1]) :
            if l[4][i][j] == "X":
                Alain_Devémy_Graphtest2.Board.colourize(i,j)

使用Board(TK)类调用第二个文件Alain_Devémy_Graphtest2中的函数colourize,如下所示:

def colourize(i, j):
  b=Board.grid[i, j]
  b.config(bg='#000')

当我执行Alain_Devémy_Graphtest2.py,它应该显示来自Noyal的板导入函数时,我的内核,我收到以下错误:

 b=Board.grid[i, j]
 TypeError: 'function' object is not subscriptable

这是我的董事会成员:

class Board(Tk):
"""a 6x6 board with clickable cells"""
# ----------------------------------------------------------------------------


def __init__ (self, nb_ligne, nb_colonne, nb_couleurs):
    self.nb_ligne = nb_ligne 
    self.nb_colonne = nb_colonne 
    self.nb_couleurs = nb_couleurs
    self.matrice_horizontale = [[True for col in range(self.nb_colonne)] for ligne in     range(self.nb_ligne+1)]
    self.matrice_verticale = [[True for col in range(self.nb_colonne+1)] for ligne in range(self.nb_ligne)]
    self.matrice_cellules = [[0 for col in range(self.nb_colonne)] for ligne in range(self.nb_ligne)]
    self.matrice_numbers= [[0 for col in range(self.nb_colonne)] for ligne in range(self.nb_ligne)]

    for i in range(0, self.nb_ligne):
        for j in range(0, self.nb_colonne):
            p = random.randint(0,(self.nb_couleurs)-1)
            self.matrice_cellules[i][j] = p

    lettre=["A","B","C","D","E","F","G","H", "I", "J"]      
    case=""
    p = 0
    for i in range(0, self.nb_ligne):
        for j in range(0, self.nb_colonne):              
            case+=lettre[j]
            case+=str(i)

            self.matrice_numbers[i][j] = case
            case=""
    print (self.matrice_cellules)
    print (self.matrice_numbers)
    """create 36 colored 'Button' widgets and pack them as a 6x6 grid"""
    colors = ('#F00', '#0F0', '#00F', '#FF0','#F0F', '#000')

    # --------------------------------------------------------------------------
    Tk.__init__(self)

    self.label = Label(self,  border=2, relief=SOLID) 
    self.label.pack(side=TOP, fill=BOTH, pady=5, padx=5)
    # --------------------------------------------------------------------------
    self.frame = Frame(self, border=2, relief=SOLID)
    self.frame.pack(side=TOP, expand=YES, padx=5, pady=5)
    self.grid = {} 
    for n in range(nb_ligne*nb_colonne):         
      col, row = n%nb_colonne, n//nb_colonne          
      self.grid[row,col] = Button(self.frame, width=3, height=1, bg=colors[self.matrice_cellules[row ][col]], command = lambda : Alain_Devémy_Noyal.Kernel.callback(self,(nb_ligne, nb_colonne, nb_couleurs, self.matrice_numbers, self.matrice_cellules), self.matrice_numbers[row][col]))
      self.grid[row,col].grid(column=col, row=row)
    # --------------------------------------------------------------------------
    self.colourize(0,0)
    self.title("Board"); self.resizable(0,0); self.mainloop();self.update()


def colourize(self,i,j):
  print(self.grid[0,1])

  self.grid[i,j].configure(bg="#FFF")
  #self.grid(row=i,column=j)
  #self.grid[i][j].config(bg="black")
  #b.config(bg='#FFF')





# ==============================================================================
def main() :
 a=int(input('Entrez le nombre de lignes'))
 b=int(input('Entrez le nombre de colonnes'))
 c=int(input('Entrez le nombre de couleurs'))
 board = Board(a, b, c)
 Noyau = Kernel(board)
 board.colourize(0,0)  

# ==============================================================================
if __name__ == "__main__": 
main()

这是我的内核类:

from tkinter import *
import random
import Alain_Devémy_Graphtest2
# ==============================================================================
class Kernel():

    def __init__(self,board):
            self.board = board

    def suppr(self,l,case):
            for i in range(0, l.nb_ligne) :
               for j in range(0, l.nb_colonne) :
                   if l.matrice_numbers[i][j] == case :


                       couleur = l.matrice_cellules[i][j]
                       l.matrice_cellules[i][j] = "X"
                       verif(l,i,j,couleur)




    # ==============================================================================
    def verif(self,l,i,j,couleur):
                    if(i>0):
                       if l.matrice_cellules[i-1][j] == couleur : #case au dessus
                           l.matrice_cellules[i-1][j] = "X"
                           verif(l,i-1,j,couleur)
                    if(j>0):
                       if l.matrice_cellules[i][j-1] == couleur : #case à gauche
                           l.matrice_cellules[i][j-1] = "X"
                           verif(l,i,j-1,couleur)
                    if(i<l.nb_ligne-1):
                       if l.matrice_cellules[i+1][j] == couleur : #case en dessous
                           l.matrice_cellules[i+1][j] = "X"
                           verif(l,i+1,j,couleur)
                    if(j<l.nb_colonne-1):
                       if l.matrice_cellules[i][j+1] == couleur : #case à droite
                           l.matrice_cellules[i][j+1] = "X"
                           verif(l,i,j+1,couleur)
    # ==============================================================================
    def gravity(self,l):

            for j in range(0, l.nb_colonne) :
                for i in range(l.nb_ligne-2, 0, -1) :

                    while l.matrice_cellules[i][j]!= "X" and l.matrice_cellules[i+1][j]== "X" :
                            for k in range(0, l.nb_colonne) :
                                for q in range(l.nb_ligne-1, 0, -1) :
                                    if l.matrice_cellules[q][k] == "X":
                                        l.matrice_cellules[q][k] = l.matrice_cellules[q-1][k]
                                        l.matrice_cellules[q-1][k] = "X"
                                for q in range(l.nb_ligne-1, 0, -1) :
                                    if l.matrice_cellules[q][k] == "X":
                                        l.matrice_cellules[q][k] = l.matrice_cellules[q-1][k]
                                        l.matrice_cellules[q-1][k] = "X"
                                for q in range(l.nb_ligne-1, 0, -1) :
                                    if l.matrice_cellules[q][k] == "X":
                                        l.matrice_cellules[q][k] = l.matrice_cellules[q-1][k]
                                        l.matrice_cellules[q-1][k] = "X"

            for j in range(0, l.nb_colonne) :
                if  l.matrice_cellules[l.nb_ligne-1][j]== "X" :
                    for k in range (j, l.nb_colonne-1) :
                        for q in range(0, l.nb_ligne) :
                            if  k == l.nb_colonne-1 :
                                    l.matrice_cellules[q][k] = "X"
                            else :
                                    l.matrice_cellules[q][k] = l.matrice_cellules[q][k+1]
                                    l.matrice_cellules[q][k+1] = "X"
    def suppr_graph(self,l, case):

              for i in range(0, l[0]) :
               for j in range(0, l[1]) :
                   if l[3][i][j] == case :
                       print('caca')
                       couleur = l[4][i][j]
                       print(couleur)
                       l[4][i][j] = "X"
                       print(l[4][i][j])
                       Kernel.verif_graph(self, l,i,j,couleur)
              for i in range(0, l[0]) :
               for j in range(0, l[1]) :
                       if  l[4][i][j] == "X":

                               print('lala')
                               Alain_Devémy_Graphtest2.Board.colourize(self,i,j)
      def gravity_graph(self,l):
             print(l[4])
             for j in range(0, l[1]) :
                for i in range(l[0]-2, 0, -1) : 
                    while l[4][i][j]!= "X" and l[4][i+1][j]== "X" :
                            for k in range(0, l[1]) :
                                for q in range(l[0]-1, 0, -1) :
                                   for l in range (0, 9):
                                           print (l[4])
                                             if str(l[4][q][k]) == "X":
                                                  l[4][q][k] = l[4][q-1][k]
                                                  l[4][q-1][k] = "X"


               for j in range(0, l[1]) :
                  if  l[4][l[0]-1][j]== "X" :
                      for k in range (j, l[1]-1) :
                          for q in range(0, l[0]) :
                              if  k == l[1]-1 :
                                      l[4][q][k] = "X"
                              else :
                                      l[4][q][k] = l[4][q][k+1]
                                      l[4][q][k+1] = "X"
             for j in range(0, l[1]) :
                  for i in range(l[0]-2, 0, -1) :
                          if l[4][i][j] == "X":
                                 print('lala')
                                 Alain_Devémy_Graphtest2.Board.colourize(self, i, j)
    def verif_graph(self,l,i,j,couleur):
                    if(i>0):
                       if l[4][i-1][j] == couleur : #case au dessus
                           l[4][i-1][j] = "X"
                           Kernel.verif_graph(self, l,i-1,j,couleur)
                    if(j>0):
                       if l[4][i][j-1] == couleur : #case à gauche
                           l[4][i][j-1] = "X"
                           Kernel.verif_graph(self, l,i,j-1,couleur)
                    if(i<l[0]-1):
                       if l[4][i+1][j] == couleur : #case en dessous
                           l[4][i+1][j] = "X"
                           Kernel.verif_graph(self,l,i+1,j,couleur)
                    if(j<l[1]-1):
                       if l[4][i][j+1] == couleur : #case à droite
                           l[4][i][j+1] = "X"
                           Kernel.verif_graph(self, l,i,j+1,couleur)
    # ==============================================================================
    def callback(self,l,  case):
        Kernel.suppr_graph(self, l, case)
        #Kernel.gravity_graph(self,l)
你可以帮助我吗?正如我所看到的,你在其他主题上非常有效率。提前致谢

1 个答案:

答案 0 :(得分:0)

查看 Board 的实施非常有用。

但是,使用提供的信息,这里似乎有两个问题。

  1. 错误表明 Board.grid 是一个函数, 所以使用 list [i] 之类的符号下标不会起作用。

  2. 下标看起来像是反对 标准的Python表示法,因为逗号不应该出现在其中 下标时的括号。

  3. 最可能的情况是你只是试图调用一个函数,但是使用了[]而不是(),修复就是交换

    b=Board.grid[i, j]
    

    b=Board.grid(i, j)
    

    或一直

    b=Board.grid([i, j])
    

    后者是对 Board.grid 的调用,其中坐标列表是唯一的参数。

    或者,如果您打算使用下标,那么 Board.grid 可能应该是嵌套列表。在该演员表中,该行必须是

    b=Board.grid[i][j]
    

    此解决方案需要进行大量的重新设计,才能将 Board.grid 更改为嵌套列表,而不是当前的功能。

    更新

    我没有想过 Board.grid 是字典的情况,你通过 Board.grid [i,j]发送元组作为下标

    这完全有效,所以唯一的问题是你在为Board继承的Tk类定义的网格函数和你定义为dict的网格属性之间得到命名冲突按钮。

    最简单的解决方案可能是将您的 Board.grid 重命名为 Board.button_grid 或类似内容,以避免此冲突。