2017-10-06 13 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} 

今、私は完全に私が操作可能なオブジェクトのようにこれらの文字列を作ることができるどのようにかかわらず困惑し、切断の対象としています、コピー、貼り付け、削除、並べ替えなど、テキストGUI内で行うことができます。プログラムで新しい単語を入力したり、新しいオブジェクトを作成したり、開いたファイルを変換したときに初期化されたオブジェクトを操作したりする必要はありません。

何か助けや指示があれば幸いです。ありがとう。

私はあなたがそのテキストを表示する必要があるときにいつでも

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

ような何かを行うことができること、その後、あなたがそう

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

、その後printableStrがいいだろうと同じようにループを通るだろうと思う

+0

文字列として 'strContent'を追加するだけでなく、辞書の各オブジェクトを参照することもできないのでしょうか?各単語は辞書キーです。ここで、そのキーに割り当てられた値は、上で概説した辞書です。 –

+0

私は辞書を利用するのが好きですが、ソーステキストには同じ単語の重複が含まれています。たとえば、醜い解決策は、各単語の先頭にインデックスを付けたテキストをレンダリングします。
00And 01here 02is 03a 04sample 05text 06which 07is 08simple。
ここではGuiの仮説エディタで次のように編集しています。
Acronomic

+0

リストを作成できますか?読み込んだ順に各オブジェクトをリストに追加してから、リストを反復して各 'strContent'を' text'ウィジェットに追加します。 –

答えて

0

helloのすべての情報を含む文字列

+0

これは間違いなくテキストを表示するのに役立ちますが、表示された後にテキストを操作し、それぞれの単語にメタデータを保持させたいと考えています。理想的には、appのようなテキストエディタで操作されますが、これは文字列ではなくmyObjsを操作します。 – 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"を削除するとどうなりますか?彼らは1つの "HelloWorld"アイテム、またはオリジナルの2つの "Hello"と "World"アイテムで終わるのでしょうか?

各テキスト項目が別個のオブジェクト(タグを持つことができる)であるキャンバスを使用するか、一連の入力ウィジェットを使用してデータを一度に 'もう片方に出血する。

+0

ブライアンに感謝します。理想的には、各単語は別個のオブジェクトとして維持され、テキストは変更可能であってはなりません。単語は、挿入(再配置)、削除、またはコピー(および挿入)の操作の対象にする必要があります。キャンバスウィジェットは素晴らしい提案のようですが、私は上記の操作を実行するのが簡単かどうか心配です。ユースケースには複数ページのトランスクリプトが含まれていますが、それぞれの単語でタグを維持しながら編集したいと考えています。私があなたが言及したことを実装しようとします。ご協力いただきありがとうございます。 – Acronomic

関連する問題