在网格上查找小部件(tkinter模块)

时间:2011-12-03 17:36:39

标签: python widget tkinter

使用tkinter模块,假设我创建了一个包含50个按钮小部件的网格,每个小部件都有不同的文本。我需要能够在行和列中指定某种键入方式,我可以在该位置获取该小部件的文本。例如,如果我需要网格第二列第三行的小部件文本。我搜索了文档,但是当我需要有关网格的信息时,它会告诉我如何获取有关小部件的信息。

提前致谢

3 个答案:

答案 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()