我正在编写一个游戏,其中我有一个按钮列表,我希望传递一个基于网格坐标的点击命令。当我运行程序的事件只影响列表的最后一个按钮,我不明白为什么。就像所有的按钮都有相同的坐标。你知道吗
from random import randint
from Tkinter import *
###functions
def mine(x,y):#permet de savoir si ya une mine ou combien ya de mine autour
quantite=0
if bombe[(x+1)][y]==99:
quantite=quantite+1
if bombe[x-1][y]==99:
quantite=quantite+1
if bombe[x][y+1]==99:
quantite=quantite+1
if bombe[x][y-1]==99:
quantite=quantite+1
if bombe[x-1][y-1]==99:
quantite=quantite+1
if bombe[x+1][y+1]==99:
quantite=quantite+1
if bombe[x+1][y-1]==99:
quantite=quantite+1
if bombe[x-1][y+1]==99:
quantite=quantite+1
if bombe[x][y]==99:
quantite=99
demineur[(x)][(y)].configure(text=str(quantite), state='disabled')
####
###creer le tableau et placer les mine aléatoirement tableau de 10x10
bombe = [[0 for a in range(10)] for b in range(10) ] #creer mon tableau demineur "a=axe x" "b=axe y"
i=0
while i<20:#placer des bombes aléatoirement dans le jeux qui est 10 par 10
x = (randint(0,9))
y = (randint(0,9))
if bombe[x][y]==0:
bombe[x][y]=99
i=i+1
root = Tk()
root.title("Demineur")#title de la window
root.geometry("450x550")#size de la widow
app = Frame(root)
app.grid()
demineur = [[ Button(app, text = str((j)*10+(i+1)), height = 2, width = 4) for i in range (10)] for j in range (10)] #creer les button de mon interface 10 par 10
x=1
for i in range(0,9):
y=1
for j in range (0,9):
demineur[x][y].configure(command= lambda: mine(x, y))
y=y+1
x=x+1
ranger=1
colonne=1
for i in demineur:
colonne=1
for j in i:
j.grid(row=ranger, column=colonne)
colonne=colonne+1
ranger=ranger+1
root.mainloop()
这个问题已经被问了很多次了,但是我没有找到一个我喜欢的答案。关键的思想是,您必须捕获参数的值,在本例中是x和y的值,当您分配命令时。一种方法是将默认参数与lambda表达式一起使用。你知道吗
如果捕获的值被赋予不同的名称,这可能会更清楚。你知道吗
或者定义一个包装函数。你知道吗
或者使用functools模块中的partial。你知道吗
PS公司
更容易阅读和理解
下一个嵌套循环也是如此。你知道吗
相关问题 更多 >
编程相关推荐