<p>注意:这试图回答被问到的问题,但我怀疑这是一个<a href="https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem">xy problem</a>。在这个答案的最后,我将给出一些其他的建议。你知道吗</p>
<hr/>
<p>文本小部件不能有一些复杂的对象作为其底层数据结构。它可以显示文本,并且可以有与文本相关联的标记。您也可以插入图像和小部件,但我认为这与您的要求无关。你知道吗</p>
<p>在中读取数据时,可以为每段元数据构造标记,并将这些标记与一系列文本相关联。例如,单词“Hello”可能有标签“第3段", "演讲者:乔,和索引:0". "世界“将是相似的,除了它会有标签”索引:1". 你知道吗</p>
<p>这在最初显示数据时很容易做到。例如:</p>
<pre><code>data = [{"strContent": "Hello", "index": 0, "speaker": "Joe", "paragraph": 3},
{"strContent": "World", "index": 1, "speaker": "Joe", "paragraph": 3}
]
for item in data:
tags = (
"index:%d" % item['index'],
"speaker:%s" % item['speaker'],
"paragraph:%d" % item['paragraph']
)
self.text.insert("end", item['strContent'], tags)
</code></pre>
<p>如果你在单词“World”中插入“r”,它将继承周围文本的标签。你知道吗</p>
<p>您可以使用<code>dump</code>方法从小部件中获取数据,该方法返回一个数据流。例如,<code>self.text.dump("1.0", "end-1c", tag=True, text=True, mark=False)</code>产生以下信息:</p>
<pre><code>[
('tagon', 'paragraph:3', '1.0'),
('tagon', 'speaker:Joe', '1.0'),
('tagon', 'index:0', '1.0'),
('text', 'Hello', '1.0'),
('tagoff', 'index:0', '1.5'),
('tagon', 'index:1', '1.5'),
('text', 'World', '1.5')
]
</code></pre>
<p>将数据重新组装回原始格式是一件棘手的事情。这是一个粗略的尝试,虽然我不知道它如何站起来在现实世界中。用户可能会以完全破坏结构的方式编辑数据。你知道吗</p>
<pre><code>def get_data(self):
result = []
meta = {}
for item in self.text.dump("1.0", "end-1c", tag=True, text=True, mark=False):
if item[0] == "tagon":
(name, value) = item[1].split(":")
meta[name] = value
if item[0] == "tagoff":
(name, value) = item[1].split(":")
del meta[name]
if item[0] == "text":
text = item[1]
# if this text has the same tags as the previous text,
# don't create a new item; instead, append the text to
# the previous item
if result and all(item in result[-1].items() for item in meta.items()):
result[-1]["strContent"] += text
else:
data = {"strContent": text}
data.update(meta)
result.append(data)
return result
</code></pre>
<hr/>
<p>由于不知道您实际要完成什么,文本小部件可能不是最佳解决方案,因为它给了用户太多修改文本的自由。例如,如果他们将“Hello”改为“HelloWorld”,然后删除原来的“World”,会发生什么?他们最终会得到一个“HelloWorld”项目,还是原来的两个“Hello”和“World”项目?你知道吗</p>
<p>您可能需要考虑使用画布,其中每个文本项都是一个不同的对象(也可以有标记),或者您可能需要使用一系列条目小部件,以便一次中的数据不会流入另一次中。你知道吗</p>