我需要在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()
这将是这样的,我想获得按钮网格位置,并使用它来更改k
和m
变量,使空格位于按下按钮所在的位置。
答案 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()
因此,更改k
和m
值会在其他地方创建差距...