Python 为什么可以';我不能改变我按钮的颜色吗?

Python 为什么可以';我不能改变我按钮的颜色吗?,python,function,tkinter,call,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[

我正在编写一个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中调用着色函数,如下所示:

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:“函数”对象不可下标
这是我的董事会课程:

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)
从tkinter导入*
随机输入
导入Alain_Devémy_图形测试2
# ==============================================================================
类内核():
def ___;初始(自我,板):
self.board=board
def供应器(自、左、箱):
对于范围内的i(0,l.nb_线):
对于范围内的j(0,l.nb_科隆):
如果l.matrice_数[i][j]==情况:
couleur=l.matrice_cellues[i][j]
l、 矩阵单元[i][j]=“X”
验证(l、i、j、couleur)
# ==============================================================================
定义验证(自、l、i、j、couleur):
如果(i>0):
如果l.matrice_cellules[i-1][j]==couleur:#case au dessus
l、 矩阵单元[i-1][j]=“X”
验证(l,i-1,j,couleur)
如果(j>0):
如果l.matrice_cellules[i][j-1]==couleur:#caseágauche
l、 矩阵单元[i][j-1]=“X”
验证(l,i,j-1,couleur)
如果(i0):
如果l[4][i][j-1]==couleur:#caseágauche
l[4][i][j-1]=“X”
Kernel.verif_图(self,l,i,j-1,couleur)

如果(i看到板的实现将非常有用

然而,根据提供的信息,这里似乎有两个问题

  • 错误表明Board.grid是一个函数, 因此,使用类似于list[i]的符号进行订阅是行不通的

  • 订阅看起来像是反对的 标准Python符号,作为逗号,不应该出现在 下标时使用括号

  • 最可能的情况是,您只是尝试调用一个函数,但使用了[]而不是(),修复方法是交换

    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的网格属性之间存在命名冲突


    最简单的解决方案可能是将您的板.grid重命名为板.button\u grid或类似名称,以避免此冲突。

    您必须使用按钮的Tkinter Id。请参阅此处的配置示例,它设置浮雕而不是背景,但您可以使用配置来配置confi下列出的任何选项g再往下一页。谢谢你的回复。根据你的建议,我修改了程序,得到了相同的错误,虽然啊,是的,grid()是一个几何管理器。我假设,但不知道,你命名了另一个“grid”,Tkinter认为它是几何管理器函数(函数的对象不可下标)。您使用的“网格”是什么,如果不是几何体管理器,则必须重命名它。我刚刚添加了我的板组成,它相当大,希望没有问题
    b=Board.grid[i][j]