참고 :이 질문에 대한 대답을 시도하지만이 xy problem 것으로 판단됩니다. 이 대답의 끝에서 나는 다른 제안을 할 것이다.
텍스트 위젯은 기본 데이터 구조로 복잡한 객체를 가질 수 없습니다. 텍스트를 표시 할 수 있으며 텍스트와 연관된 태그를 가질 수 있습니다. 이미지와 위젯을 삽입 할 수도 있지만, 내가 생각하는 것과는 관련이 없다고 생각합니다.
데이터를 읽을 때 각 메타 데이터 조각에 태그를 만들고 해당 태그를 텍스트 범위와 연결할 수 있습니다. 예를 들어 "Hello"라는 단어는 "paragraph : 3", "speaker : Joe"및 "index : 0"태그를 가질 수 있습니다. 1 "
이 처음에 데이터를 표시 할 때 쉽게 할 수있을 것입니다 예를 들면 다음과 같습니다 : 인덱스"는 태그가 것을 제외하고 세계는 유사하다 "..
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)
당신은 그 때 가서하는 경우
데이터 스트림을 반환하는 dump
메서드를 사용하여 위젯에서 데이터를 다시 가져올 수 있습니다. 예를 들어, "World"라는 단어에 "r"을 삽입하면 주변 텍스트의 태그가 상속됩니다. self.text.dump("1.0", "end-1c", tag=True, text=True, mark=False)
은이 정보를 산출합니다 :
[
('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')
]
원래 형식으로 다시 데이터를 재구성하는 것은 까다 롭습니다. 여기 실제 시도에서 어떻게 일어날 지 모르지만 시도의 대략적인 단점이 있습니다.사용자가 구조를 완전히 엉망으로 만드는 방식으로 데이터를 편집 할 수도 있습니다. 그것은 조금 너무 텍스트를 변경할 수 많은 자유를 사용자에게 제공하기 때문에
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
는 당신이 실제로 달성하기 위해 노력하고 무엇을 알고하지, 텍스트 위젯은 최선의 해결책이 될하지 않을 수 있습니다. 예를 들어, "Hello"를 "HelloWorld"로 변경 한 다음 원래 "World"를 삭제하면 어떻게됩니까? 최종적으로 하나의 "HelloWorld"항목 또는 원래의 두 개의 "Hello"및 "World"항목으로 끝나나요?
각 텍스트 항목이 별개의 객체 (태그가있을 수 있음) 인 캔버스를 사용하거나 일련의 항목 위젯을 사용하여 한 번에 ' 다른 한쪽으로 피 흘림.
'strContent'를 텍스트에 문자열로 추가하거나 사전의 각 객체를 참조 할 수없는 이유가 있습니까? 에서와 마찬가지로 각 단어는 해당 키에 할당 된 값이 위에 설명 된 사전 인 사전 키입니다. –
나는 사전을 사용하는 것을 좋아하지만 원본 텍스트에는 동일한 단어의 중복이 포함됩니다. 예를 들어 추악한 솔루션은 각 단어의 시작 부분에 색인이 붙은 텍스트를 추가합니다.
00And 01here 02is 03a 04sample 05text 06which 07is 08simple.
이제 Gui의 가상 편집기에서이 텍스트를 다음과 같이 편집하십시오.
– Acronomic
목록을 작성할 수 있습니까? 각 객체를 읽는 순서대로 목록에 추가 한 다음 목록을 반복하고 각'strContent'를'text' 위젯에 추가하십시오. –