使用tkinter模块,假设我创建了一个包含50个按钮小部件的网格,每个小部件都有不同的文本。我需要能够在行和列中指定某种键入方式,我可以在该位置获取该小部件的文本。例如,如果我需要网格第二列第三行的小部件文本。我搜索了文档,但是当我需要有关网格的信息时,它会告诉我如何获取有关小部件的信息。
提前致谢
答案 0 :(得分:6)
Tkinter在框架的children
属性中存储子窗口小部件列表。
通过比较所有孩子的grid_info()
,您可以在给定的行或列上找到小部件。
请参阅以下示例的find_in_grid
函数:
from Tkinter import *
root = Tk()
def find_in_grid(frame, row, column):
for children in frame.children.values():
info = children.grid_info()
#note that rows and column numbers are stored as string
if info['row'] == str(row) and info['column'] == str(column):
return children
return None
#create an array of button
width = 10
for i in range(width):
for j in range(width):
b = Button(root, text=str(i*width+j))
b.grid(row=i, column=j)
#Create two entries to set row and column to find. Changing entries print the
#text of the button (and flash it on compatible platforms)
def update(var, value, op):
r = row.get()
c = col.get()
b = find_in_grid(root, r, c)
if b:
print "button ({0},{1}) : {2}".format(r, c, b["text"])
b.flash()
Label(root,text="row:").grid(row=width,column=0)
row = StringVar()
row.trace('w',update)
Entry(root,textvar=row, width=3).grid(row=width,column=1)
Label(root,text="col:").grid(row=width,column=2)
col = StringVar()
col.trace('w',update)
Entry(root,textvar=col, width=3).grid(row=width,column=3)
row.set('3')
col.set('2')
mainloop()
注意:这个小例子不处理生成小部件
答案 1 :(得分:1)
你有一个previous answer相对于一个方法来保存字典中的按钮对象,以便使用它们在网格中的(列,行)位置来恢复它们。
因此,如果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"]
答案 2 :(得分:0)
无需创建自己的函数或保留列表/字典,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()