Если вы хотите, чтобы содержимое двух текстовых виджетов было идентичным, текстовый виджет имеет малоиспользуемую функцию, известную как одноранговые виджеты. По сути, у вас может быть несколько текстовых виджетов с одной и той же базовой структурой данных.
каноническая документация по 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()
person
Bryan Oakley
schedule
08.10.2019
insert
вызоветinsert() takes at least 3 arguments (2 given)
- person Kenly   schedule 08.10.2019