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

时间:2015-07-01 16:10:24

标签: python button tkinter

我需要在Python 2.7中使用Tkinter创建按钮表,其中包含n行和n列,并且右下角没有按钮。

问题是,当我按下一个按钮,在它的位置,我需要创建自由空间并将该按钮移动到之前为空的空间,我不能这样做,因为我不知道如何获得网格(x和y轴)按下按钮的信息,用它来创建自由空间。

这是我目前的代码:

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变量,使空格位于按下按钮所在的位置。

3 个答案:

答案 0 :(得分:4)

您可以使用按钮的lambda表达式传递行和列:

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

答案 1 :(得分:0)

你可以做一些事情,比如在前面创建按钮网格,但在空白区域中包含一个隐藏按钮吗?然后,当单击按钮时,隐藏单击的按钮并显示隐藏的按钮。然后你不必担心移动按钮,除非你出于某种原因需要移动实际的按钮对象。

编辑以增强评论的答案:

下面是一个隐藏按钮的简单示例,它还显示了如何跟踪按钮,除非我搞砸了将其移动到编辑器。这可以转换为按钮的列表或字典或任何需要的。您还需要确定找到一种方法来注册本地按钮或添加一些上下文来知道要显示或隐藏哪一个。

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

答案 2 :(得分:-1)

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

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值会在其他地方创建差距...