поиск виджетов по сетке (модуль tkinter) - PullRequest
3 голосов
/ 03 декабря 2011

Используя модуль tkinter, предположим, что я создал сетку с 50 виджетами кнопок, и каждый из этих виджетов имеет различный текст. Мне нужно иметь возможность указать какой-либо способ ввода в строке и столбце, и я могу получить текст этого виджета в этом месте. Так, например, если мне нужен текст виджета в третьей строке во втором столбце сетки. Я искал документы, но это говорит мне, как получить информацию о виджетах, когда мне нужна информация о сетке.

Заранее спасибо

Ответы [ 3 ]

6 голосов
/ 08 декабря 2011

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 голос
/ 04 декабря 2011

Вы получили предыдущий ответ относительно метода сохранения объектов кнопок в словаре, чтобы восстановить их, используя их положение (столбец, строку) в сетке.

Так что если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"]
0 голосов
/ 31 июля 2018

Нет необходимости создавать свою собственную функцию или вести список / словарь, в 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...