我正在编写一个游戏,其中我有一个按钮列表,我希望传递一个基于网格坐标的点击命令

2024-06-26 14:35:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个游戏,其中我有一个按钮列表,我希望传递一个基于网格坐标的点击命令。当我运行程序的事件只影响列表的最后一个按钮,我不明白为什么。就像所有的按钮都有相同的坐标。你知道吗

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()

Tags: inforifrangederoot按钮randint
1条回答
网友
1楼 · 发布于 2024-06-26 14:35:11

这个问题已经被问了很多次了,但是我没有找到一个我喜欢的答案。关键的思想是,您必须捕获参数的,在本例中是x和y的值,当您分配命令时。一种方法是将默认参数与lambda表达式一起使用。你知道吗

      demineur[x][y].configure(command= lambda x=x, y=y: mine(x, y))

如果捕获的值被赋予不同的名称,这可能会更清楚。你知道吗

      demineur[x][y].configure(command= lambda xn=x, yn=y: mine(xn, yn))

或者定义一个包装函数。你知道吗

def wrap(x, y): return mine(x, y)
....
      demineur[x][y].configure(command=wrap(x, y))

或者使用functools模块中的partial。你知道吗

from functools import partial
...
      demineur[x][y].configure(command=partial(mine, x, y)

PS公司

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

更容易阅读和理解

for x in range(1, 10):
     for y in range (1, 10):
          demineur[x][y].configure(command= lambda: mine(x, y))

下一个嵌套循环也是如此。你知道吗

相关问题 更多 >