我正在编写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)
你可以帮助我吗?正如我所看到的,你在其他主题上非常有效率。提前致谢
答案 0 :(得分:0)
查看 Board 的实施非常有用。
但是,使用提供的信息,这里似乎有两个问题。
错误表明 Board.grid 是一个函数, 所以使用 list [i] 之类的符号下标不会起作用。
下标看起来像是反对 标准的Python表示法,因为逗号不应该出现在其中 下标时的括号。
最可能的情况是你只是试图调用一个函数,但是使用了[]而不是(),修复就是交换
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 或类似内容,以避免此冲突。