簡體   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