Python 为什么可以';我不能改变我按钮的颜色吗?
我正在编写一个Samegame,作为我用Tkinter研究Python的项目。 case是一个2个字符的代码,用于标识我的板上单击的正方形(例如A9) 此功能: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[
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]