如何通过仅输入同一个小部件来将文本输入到两个文本小部件中

How to enter text into two text widgets by just entring into same widget

我想要一种方法,通过在单个文本小部件中输入文本,我可以将文本插入到两个小部件中。简单的编程就是我想将文本小部件的所有功能和事件绑定到另一个文本小部件。 我试过

txt=Text(root,height=300,width=300)
txt.pack()
text=Text(root,height=300,width=300)
text.pack()
def func(event):
    text.delete("1.0","end")
    text.insert(INSERT,txt.get("1.0","end"))
txt.bind(func,<Any-KeyPress>)

但这不是一个好的选择,因为它需要时间并且会显示一些延迟,并且当文本变长时会出现一些较长的延迟。

我发现更新第二个框中文本的最快方法是使用 replace()get()。也就是说,在测试您的示例后,我并没有真正看到明显的延迟。

我们可以使用 Modified 事件来管理我们的更新,并且在每次修改后我们可以告诉 text1 Modified 是 False 这样我们就可以得到每次更改的更新。

如果这就是您要找的,请告诉我。

试试这个:

import tkinter as tk


def update_text2(_=None):
    text2.replace('1.0', 'end', text1.get('1.0', 'end'))
    text1.edit_modified(False)


root = tk.Tk()
text1 = tk.Text(root)
text2 = tk.Text(root)
text1.pack()
text2.pack()

text1.bind('<<Modified>>', update_text2)

root.mainloop()

如果您希望两个文本小部件的内容相同,文本小部件有一个很少使用的功能,称为 peer widgets。实际上,您可以拥有多个共享相同底层数据结构的文本小部件。

canonical tcl/tk documentation这样描述同行:

The text widget has a separate store of all its data concerning each line's textual contents, marks, tags, images and windows, and the undo stack.

While this data store cannot be accessed directly (i.e. without a text widget as an intermediary), multiple text widgets can be created, each of which present different views on the same underlying data. Such text widgets are known as peer text widgets.

不幸的是,tkinter 对文本小部件对等的支持并不完整。但是,可以创建一个使用对等功能的新小部件 class。

下面定义了一个新的小部件,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()