【问题标题】:How to get grid information from pressed Button in tkinter?如何从 tkinter 中的按下按钮获取网格信息?
【发布时间】:2015-09-18 22:02:52
【问题描述】:

我需要在 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 变量以在按下按钮的位置留出空白空间。

【问题讨论】:

  • 如果你在你想要做的事情周围包含一个代码sn-p,它会增加你得到一个好答案的机会

标签: python button tkinter


【解决方案1】:

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

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

【讨论】:

  • Tnx 伙伴对我帮助很大!
【解决方案2】:

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

编辑以增强 cmets 的回答:

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

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

【讨论】:

  • 这会起作用,因为我实际上不需要移动那个按钮。究竟如何创建空白按钮?
  • 再次这样做,我需要获取点击按钮的网格信息
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多