在网格中找到小部件(tkinter)

6 投票
2 回答
16873 浏览
提问于 2025-04-17 07:36

使用 tkinter 模块,假设我创建了一个包含50个按钮的小格子,每个按钮上都有不同的文字。我需要一种方法,可以通过输入行和列的数字,来获取那个位置上按钮的文字。

举个例子,如果我想要获取网格中第二列第三行的按钮文字。我查阅了文档,但里面讲的是如何获取按钮的信息,而我其实想知道的是关于这个小格子的信息。

2 个回答

6

其实你不需要自己写函数或者维护一个列表或字典,tkinter已经有一个内置的方法叫做 grid_slaves()

你可以这样使用它:frame.grid_slaves(row=some_row, column=some_column),这样就能获取到指定行和列的控件。

下面是一个例子,展示了一个按钮的网格,说明了 grid_slaves() 是如何获取控件的,同时也展示了文本内容。

import tkinter as tk
root = tk.Tk()

# Show grid_slaves() in action
def printOnClick(r, c):
    widget = root.grid_slaves(row=r, column=c)[0]
    print(widget, widget['text'])

# Make some array of buttons
for r in range(5):
    for c in range(5):
        btn = tk.Button(root, text='{} {}'.format(r, c),
                        command=lambda r=r, c=c: printOnClick(r, c))
        btn.grid(row=r, column=c)

tk.mainloop()
1

你之前有一个回答,提到了一种方法,可以把按钮对象保存在一个字典里,这样就可以通过它们在网格中的(列,行)位置来找回它们。

所以,如果 self.mybuttons 是你字典中按钮列表的名字,正如之前的回答所说的那样,你可以这样获取某个位置(行,列)的文本:

abutton = self.mybuttons[arow][acolumn]
text_at_row_col = abutton["text"]

另一方面,如果你需要从按钮的回调中获取文本:

button.bind("<Button-1>", self.callback)

那么你可以通过事件来获取按钮的文本,你不需要知道它的行/列位置,只需要按下它即可:

def callback(self, event):
    mybutton = event.widget
    text_at_row_col = mybutton["text"]

撰写回答