найти индекс элементов, созданных с помощью window_create внутри tkinter Text - PullRequest
1 голос
/ 10 мая 2019

Я использовал 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)

edit: если вы хотите воссоздать проблему, используйте это:

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 Ответ

2 голосов
/ 10 мая 2019

Нет ничего, что дает вам именно то, что вы хотите, но просто требуется пара строк кода, чтобы получить индекс нажатой кнопки.

Я бы сделал так, чтобы кнопка передавала ссылку на себя в качестве аргумента команды. Это требует создания кнопки в два этапа, поскольку вы не можете ссылаться на кнопку до ее создания.

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()
...