在网格中找到小部件(tkinter)
使用 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"]