根据x,y坐标隐藏小部件

时间:2013-12-08 16:24:26

标签: python button minesweeper

在编程方面,我是一个新手,在学校的编程练习中,我使用TKinter作为GUI在python中制作扫雷游戏。 除了我的“floodfill”算法之外,游戏可以清除任何相邻的空白区域。 我根据用户选择的选项(高度,宽度和地雷数量)制作了电路板,打印了以前创建的列表,标签和隐藏在按钮后面的这些标签。

我可以绑定事件以在点击时隐藏这些按钮,但我还想要的是能够借助我的Floodfill算法隐藏附近的按钮。我觉得我需要的只是根据x和y坐标隐藏按钮的代码行,而不仅仅是点击的按钮。 我想你已经有了这个主意,

def initGame(field, height, width, mn):     
    play = tk.Toplevel()
    play.grid()
    title = ttk.Label(play, text= "MineSweeper")
    title.grid(row=0)
    playfield = tk.LabelFrame(play, text = None)
    playfield.grid(row = 1, rowspan = height+2, columnspan = width+2)       
    mine = tk.PhotoImage(file='mine.gif')
    for i in range(1, height+1):
        for j in range(1, width+1):             
            if  field[i][j] == '9':
                val = tk.Label(playfield, image = mine)
                val.image=mine
            else:
                val = tk.Label(playfield, text= "%s" %(field[i][j]))
            val.grid(row=i-1, column=j-1)
    blist = []
    for i in range(1, height+1):
        for j in range(1, width+1):
            btn = tk.Button(playfield, text = '   ')
            blist.append(btn)

            def handler(event, i=i, j=j):
                return floodfill(event, field, blist, j, i)
            btn.bind('<ButtonRelease-1>', handler)
            btn.bind('<Button-3>', iconToggle)
            btn.grid(row=i-1, column=j-1)

def floodfill(event, field, blist, x, y):
    edge = []
    edge.append((y,x))
    while len(edge) > 0:
        (y,x) = edge.pop()
        if field[y][x] != '9':
            #####################
        else:
            continue
        for i in [-1, 1]:
            for j in [-1, 1]:
                if y + i >= 1 and y + i < len(field)-1:       
                    edge.append((y + i, x))
                if x + j >= 1 and x + j < len(field[0])-1:
                    edge.append((y, x + j))
#p的长线是我认为我需要的所有东西才能使这个系统工作,比如“button.position(x,y)”。 我试图在blist中保存按钮,也许我可以在x和y坐标的帮助下得到需要隐藏的正确按钮?

当然,如果你对如何解决这个问题有了更好的了解,我很乐意听到它。

1 个答案:

答案 0 :(得分:0)

将按钮保存在2D数组中,因此blist [x,y]表示x,y位置的按钮。当你知道x,y位置时应该是正确的按钮。

编辑:

首先创建2D数组。

blist = []
for i in range(1, height+1):
    tmpList = []
    for j in range(1, width+1):
        btn = tk.Button(playfield, text = '   ')
        tmpList.append(btn)

        def handler(event, i=i, j=j):
            return floodfill(event, field, blist, j, i)
        btn.bind('<ButtonRelease-1>', handler)
        btn.bind('<Button-3>', iconToggle)
        btn.grid(row=i-1, column=j-1)

    blist.append(tmpList)

然后用它来获取泛洪函数中的按钮对象:

 if field[y][x] != '9':
        Button_To_Hide = blist[x-1][y-1] 
        Button_To_Hide.grid_forget()

现在你可能需要在这里切换x和y。 -1,因为你已经开始使用字段坐标中的1进行索引(我认为)。