Найти индекс элементов, созданных с помощью window_create внутри tkinter Text
Я использовал window_create для создания интерактивных кнопок внутри элемента Text. Кнопки представляют собой случайные или статические значения, и я хочу иметь возможность компилировать содержимое текстового элемента и заменять кнопки их соответствующими значениями. Тем не менее, я не могу найти, где любая из кнопок.
я пробовал self.text.get("1.0",tk.END)
, но возвращает только текст, не включая элементы кнопки
элементы кнопки создаются так:
btn_text = tk.StringVar()
value = StaticValue('static', btn_text, self.custom_val_veiwer, idx)
button = tk.Button(self.text,
textvariable=btn_text, command=lambda v=value:
self.veiw_custom_val(None, val=v))
btn_text.set('static')
self.custom_vals.append(value)
self.text.window_create(tk.INSERT, window=button)
редактировать: если вы хотите воссоздать проблему, используйте это:
import tkinter as tk
root = tk.Tk()
text = tk.Text(root)
text.pack()
text.insert(tk.END, 'before button')
button = tk.Button(text, text='button')
text.window_create(tk.END, window=button)
text.insert(tk.END, 'after button')
print(text.get("1.0",tk.END))
root.mainloop()
обратите внимание, как кнопка появляется в текстовом поле, но она не распечатывается
(выход before buttonafter button
Я хочу что-то вроде before button<button>after button
или функция, которая сказала бы мне, что есть кнопка в строке x в индексе y)
1 ответ
Там нет ничего, что дает вам именно то, что вы хотите, но просто требуется несколько строк кода, чтобы получить индекс нажатой кнопки.
Я хотел бы, чтобы кнопка передавала ссылку на себя в качестве аргумента команды. Это требует создания кнопки в два этапа, поскольку вы не можете ссылаться на кнопку до ее создания.
button = tk.Button(text, text="button")
button.configure(command=lambda button=button: handle_click(button))
В функции, вызываемой кнопкой, вы можете использовать текстовый виджет 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()