繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM