Нет ничего, что дает вам именно то, что вы хотите, но просто требуется пара строк кода, чтобы получить индекс нажатой кнопки.
Я бы сделал так, чтобы кнопка передавала ссылку на себя в качестве аргумента команды. Это требует создания кнопки в два этапа, поскольку вы не можете ссылаться на кнопку до ее создания.
button = tk.Button(text, text="button")
button.configure(command=lambda button=button: handle_click(button))
В функции, вызываемой кнопкой, вы можете использовать команду text widget dump
, чтобы получить список всех окон, и из этого вы можете найти индекс кнопки. Команда dump вернет список кортежей. Каждый кортеж имеет ключ (в данном случае «окно»), имя окна и индекс окна. Вы можете перебрать результат этой команды, чтобы найти индекс кнопки, которая была передана функции.
def handle_click(button):
for (key, name, index) in text.dump("1.0", "end", window=True):
if name == str(button):
print("you clicked on the button at index {}".format(index))
break
Пример
Вот надуманный пример, который добавляет несколько кнопок. Нажатие на кнопку покажет индекс этой кнопки в метке. Обратите внимание, как он будет продолжать работать, даже если вы вручную отредактируете текстовый виджет, чтобы изменить индекс кнопки.
import tkinter as tk
root = tk.Tk()
text = tk.Text(root)
label = tk.Label(root)
label.pack(side="top", fill="x")
text.pack(side="top", fill="both", expand=True)
def handle_click(button):
for (key, name, index) in text.dump("1.0", "end", window=True):
if name == str(button):
label.configure(text="You clicked on the button at {}".format(index))
break
for word in ("one", "two", "three", "four", "five"):
text.insert("end", word + "\n")
button = tk.Button(text, text="click me")
button.configure(command=lambda button=button: handle_click(button))
text.window_create("insert-1c", window=button)
tk.mainloop()