如何从 tkinter 中按下的按钮获取网格信息?

How to get grid information from pressed Button in tkinter?

我需要在 Python 2.7 中使用 Tkinter 创建 table 个按钮,它有 n 行和 n 列,右下角没有按钮.

问题是,当我按下一个按钮时,我需要创建免费的 space 并将该按钮移动到之前为空的 space,但我无法这样做,因为我不知道如何获取按下按钮的网格(x 和 y 轴)信息以使用它来创建免费 space.

这是我当前的代码:

from Tkinter import *

#Input:
n=int(raw_input("Input whole positive number: "))
L = range(1,n+1)
k = n
m = n

#Program:
root = Tk()
for i in L:
    for j in L:
        frame = Frame(root)
        frame.grid(row = i, column = j)
        if j == k and i == m:
            pass
        else:
            button = Button(frame)
            button.grid(row = i, column = j)


root.mainloop()

它会是这样的,我想获得按钮网格位置,并用它来更改 km 变量以在按下的位置制作空 space按钮是。

您能否做一些事情,例如在前面创建按钮网格,但在空白处包含一个隐藏按钮 space?然后当按钮被点击时隐藏点击的那个并显示隐藏的那个。这样您就不必担心移动按钮,除非您出于某种原因需要移动实际的按钮对象。

编辑以增强评论的答案:

下面是一个隐藏按钮的简单示例,它还展示了如何跟踪按钮,除非我把它移到编辑器中搞砸了。这可以翻译成按钮列表或字典或任何需要的东西。您还需要确定找到一种方法来注册本地按钮或添加一些上下文以了解要显示或隐藏哪个按钮。

from Tkinter import Button, Frame, Tk


class myButton(Button):

    def __init__(self, *args, **kwargs):
        Button.__init__(self, *args, command=self.hideShowButton,
                        ** kwargs)
        self.visible = True

    def hideShowButton(self):
        self.visible = False
        self.pack_forget()

window = Tk()
frame = Frame(window)
frame.pack()
b1 = myButton(window, text="b1")
b1.pack()
b2 = myButton(window, text="b2")
b2.pack()
b3 = myButton(window, text="b3")
b3.pack()
window.wait_window(window)
print "At the end of the run b1 was %s, b2 was %s, b3 was %s" % (str(b1.visible), str(b2.visible), str(b3.visible))

这是我尝试的方法,问题是我仍然不知道如何获取按下按钮的行和列...

from Tkinter import *

#Input:
n = int(raw_input("Input whole positive number: "))
L = range(1,n+1)
k = n
m = n
#Try putting values for k and m which are less then n and you will see what   i need to get

#Moving:
def Move():
    #This i cant fill
    return k,m

#Program:
root = Tk()
for i in L:
    for j in L:
        frame = Frame(root)
        frame.grid(row = i,column = j)
        if i == int(k) and j == int(m):
            pass
        else:
            button = Button(frame, command = lambda: Move())
            button.pack()

root.mainloop()

因此,通过更改 km 值,在其他地方会产生差距...

您可以通过对按钮使用 lambda 表达式来传递行和列:

button = Button(..., command=lambda row=i, column=j: doSomething(row, column))