Если вы хотите, чтобы содержимое двух текстовых виджетов было идентичным, текстовый виджет имеет мало используемую функцию, известную как равноправные виджеты . В сущности, вы можете иметь несколько текстовых виджетов, которые разделяют одну и ту же базовую структуру данных.
Каноническая документация tcl / tk описывает одноранговые узлы следующим образом:
Текстовый виджет имеет отдельное хранилище всех своих данных, относящихся к текстовому содержимому каждой строки, меткам, тегам, изображениям и окнам, а также стеку отмены.
Хотя к этому хранилищу данных нельзя получить доступ напрямую (т. е. без текстового виджета какпосредник), можно создать несколько текстовых виджетов, каждый из которых представляет разные представления для одних и тех же базовых данных. Такие текстовые виджеты известны как одноранговые текстовые виджеты.
К сожалению, поддержка tkinter пиринга текстовых виджетов не завершена. Тем не менее, можно создать новый класс виджетов, который использует функцию пиринга.
Следующее определяет новый виджет, TextPeer
. Он берет другой текстовый виджет в качестве своего основного и создает одноранговый узел:
import tkinter as tk
class TextPeer(tk.Text):
"""A peer of an existing text widget"""
count = 0
def __init__(self, master, cnf={}, **kw):
TextPeer.count += 1
parent = master.master
peerName = "peer-{}".format(TextPeer.count)
if str(parent) == ".":
peerPath = ".{}".format(peerName)
else:
peerPath = "{}.{}".format(parent, peerName)
# Create the peer
master.tk.call(master, 'peer', 'create', peerPath, *self._options(cnf, kw))
# Create the tkinter widget based on the peer
# We can't call tk.Text.__init__ because it will try to
# create a new text widget. Instead, we want to use
# the peer widget that has already been created.
tk.BaseWidget._setup(self, parent, {'name': peerName})
Вы используете это подобно тому, как вы используете Text
виджет. Вы можете настроить одноранговый узел так же, как обычный текстовый виджет, но данные будут общими (т. Е. У вас могут быть разные размеры, цвета и т. Д. Для каждого однорангового узла)
Вот пример, который создает три одноранговых узла. Обратите внимание, что при вводе данных в один из виджетов будут немедленно обновляться другие. Хотя эти виджеты используют одни и те же данные, у каждого может быть свое местоположение курсора и выделенный текст.
import tkinter as tk
root = tk.Tk()
text1 = tk.Text(root, width=40, height=4, font=("Helvetica", 20))
text2 = TextPeer(text1, width=40, height=4, background="pink", font=("Helvetica", 16))
text3 = TextPeer(text1, width=40, height=8, background="yellow", font=("Fixed", 12))
text1.pack(side="top", fill="both", expand=True)
text2.pack(side="top", fill="both", expand=True)
text3.pack(side="top", fill="both", expand=True)
text2.insert("end", (
"Type in one, and the change will "
"appear in the other."
))
root.mainloop()