2017-10-06 1 views
0

개체와 같은 문자열을 조작 할 텍스트 편집기를 만들려고합니다. 이상적으로 나는 Tkinter의 Text Widget이나 다른 GUI 모듈을 서브 클래스 화하여 문자열 대신에이 사용자 정의 객체를 대체 할 수있게하고 싶습니다.Tkinter Text Widget (Python) 내에서 String 대신 사용자 정의 객체를 사용할 수 있습니까?

본질적으로 모든 단어를 메타 데이터로 태그 지정하는 개체 자체를 만드는 방법을 알고 있지만 다른 속성을 유지하면서 렌더링 된 개체를 텍스트로 조작하는 방법은 알지 못합니다.

예 :
텍스트 편집기는 "Hello World"가 포함 된 파일을 가져옵니다. 이 텍스트를 열면 두 단어 모두 관련 속성이있는 태그가 지정됩니다. (사전으로 아래에 표시하지만, 이상적으로 객체 Hello.strContent, Hello.index 등)

Hello={strContent: "Hello", index: 0, speaker: "Joe", paragraph: 3} 
World={strContent: "World", index: 1, speaker: "Joe", paragraph: 3} 
이제

나는 완전히 내가 조작 가능한 객체와 같은 이러한 문자열을 만들 수있는 방법을하지만 난처한 상황에 빠진거야, 그리고 주제는 절단 텍스트 복사, 복사, 붙여 넣기, 삭제 및 재배치. 프로그램에서 새 단어를 입력하거나 새 객체를 만들 수있게 할 필요는 없습니다. 열린 파일을 변환 할 때 초기화 된 객체 만 조작하면됩니다.

도움이나 방향에 대해 크게 감사드립니다. 감사.

+0

'strContent'를 텍스트에 문자열로 추가하거나 사전의 각 객체를 참조 할 수없는 이유가 있습니까? 에서와 마찬가지로 각 단어는 해당 키에 할당 된 값이 위에 설명 된 사전 인 사전 키입니다. –

+0

나는 사전을 사용하는 것을 좋아하지만 원본 텍스트에는 동일한 단어의 중복이 포함됩니다. 예를 들어 추악한 솔루션은 각 단어의 시작 부분에 색인이 붙은 텍스트를 추가합니다.
00And 01here 02is 03a 04sample 05text 06which 07is 08simple.
이제 Gui의 가상 편집기에서이 텍스트를 다음과 같이 편집하십시오.
Acronomic

+0

목록을 작성할 수 있습니까? 각 객체를 읽는 순서대로 목록에 추가 한 다음 목록을 반복하고 각'strContent'를'text' 위젯에 추가하십시오. –

답변

0

나는 당신이 그 텍스트를 표시해야 할 때마다 다음, 당신이 그렇게

printableStr = "" 
for paragraph in hello: 
    for word in paragraph: 
     printableStr += word.strContent + " " 
    printableStr += "\n" 

같은이 루프를 통해 것이다 당신이

class myobj: 
    def __init__(self, text): 
     self.strContent=text 
hello = [[myobj("Hello"), myObj("World")], [myobj("Paragraph"), myobj("2")]] 

처럼 뭔가를 할 수 있다고 생각하고 printableStr 좋은 것 안녕하세요 모든 정보가 포함 된 문자열

+0

이 텍스트는 분명히 표시되지만 텍스트가 표시된 후에 텍스트를 조작하고 각각의 단어에 메타 데이터가 유지되도록합니다.이상적으로는 app과 같은 텍스트 편집기에서 조작되지만 문자열 대신 myObj를 조작하는 것이 이상적입니다. – Acronomic

1

참고 :이 질문에 대한 대답을 시도하지만이 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"항목으로 끝나나요?

각 텍스트 항목이 별개의 객체 (태그가있을 수 있음) 인 캔버스를 사용하거나 일련의 항목 위젯을 사용하여 한 번에 ' 다른 한쪽으로 피 흘림.

+0

Bryan에게 감사드립니다. 이상적으로는 각 단어가 고유 한 개체로 유지되어야하며 텍스트를 변경할 수 없어야합니다. 단어는 삽입 (재배치), 삭제 또는 복사 (삽입) 작업의 영향을 받아야합니다. 캔버스 위젯은 훌륭한 제안처럼 보이지만 위 작업을 수행하는 데 사용 편의성에 대해 걱정하고 있습니다. 유스 케이스에는 여러 페이지로 된 필사본이 포함되며 각 필체는 태그를 유지하면서 편집하고 싶습니다. 당신이 언급 한 것을 구현하려고 노력할 것입니다. 당신의 도움을 주셔서 감사합니다. – Acronomic

관련 문제