[英]Finding widgets on a grid (tkinter)
使用tkinter
模块,假设我创建了一个包含 50 个按钮小部件的网格,并且每个小部件都有不同的文本。 我需要能够指定某种输入行和列的方式,以便我可以在该位置获取该小部件的文本。
例如,如果我需要网格第二列第三行中的小部件文本。 我搜索了文档,但是当我需要有关网格的信息时,它告诉我如何获取有关小部件的信息。
无需创建自己的函数或保留列表/字典,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()
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()
注意:这个小示例不处理跨越小部件
您得到了与将按钮对象保存在字典中的方法相关的先前答案,以便使用它们在网格中的(列、行)位置来恢复它们。
因此,如果 self.mybuttons 是您在上一个答案中描述的按钮列表字典,那么您可以在位置行 col 处获取文本,如下所示:
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"]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.