56913


**やりたいこと**

  1. tk.Textに受信したテキストファイルの内容（文字列）を表示させたい  
現状ではエスケープシーケンスの改行等を正しく表示することができません。

  2. tk.Textに表示している行数を確認し、指定行数を超えたら古い順に削除したい。  
上記1に関連して、表示行数が多くなってきたら古いものを消したいのですが、行数の取得方法が分かりません。

どなたか対処方法をご存知の方はご教示をお願いいたします。

* * *

**テスト用テキストファイルの内容**

[code]

    # -*- mode: python -*-
    
    block_cipher = None
    
    
    a = Analysis(['Tktest.py'],
                 pathex=['C:\\'
                 ],
    
    
[/code]

tk.Textウィジットの表示  
[![tk.Text](https://i.stack.imgur.com/OS3pu.png)](https://i.stack.imgur.com/OS3pu.png)


CC BY-SA 4.0
2019-07-26T05:52:13.097
56911
2019-07-29T04:22:14.753
2019-07-26T06:51:50.210
3060
32891
question
python python3 tk
tk.Textに文字列のエスケープシーケンスを正しく表示させたい。また、tk.Textに表示している行数を知りたい。


**受信したテキストファイルの内容（文字列）を表示させたい**

「受信した」という処理が何を示していて、その時のテータ内容がどうなっているかに依ります。

1.改行コードが読み込んだ時のまま(0x0Aや0x0D,0x0Aの内部表現?)変数等に入っている

→そのままTextウィジェットに`insert`する

2.改行コードが既に \n の文字列に置き換えられて変数等に入っている

→変数の型がbytesなら`.decode('unicode-escape')`で、  
strなら`.encode().decode('unicode-escape')`で変換してからTextウィジェットに`insert`する

参考  
[Tkinter、Textウィジェットの使い方](https://narito.ninja/blog/detail/100/)  
[Python3で文字列をUnicodeエスケープ／アンエスケープした文字列を得る](https://qiita.com/phonypianist/items/65ec69ac312936561cd7)

**行数の取得方法**

以下の方法で取得出来ます。

[code]

    int(text_widget.index('end-1c').split('.')[0])
    
[/code]

参考  
[Getting the total number of lines in a Tkinter Text
widget?](https://stackoverflow.com/q/4609382/9014308)

* * *

例えば質問記事の「受信した」テキストの内容を sampletext.py というファイルに格納したとすると、以下のようになるでしょう。

[code]

    # -*- mode: python -*-\n\nblock_cipher = None\n\n\na = Analysis(['Tktest.py'],\n             pathex=['C:\\\\'\n             ],\n
    
[/code]

そしてプログラムとしては以下で動作確認できます。

[code]

    # coding: UTF-8
    import tkinter as tk
    
    f = open('sampletext.py')
    data1 = f.read()
    f.close()
    
    root = tk.Tk()
    root.title('Editor Test')
    text_widget = tk.Text(root)
    text_widget.grid(column=0, row=0, sticky=(tk.N, tk.S, tk.E, tk.W))
    root.columnconfigure(0, weight=1)
    root.rowconfigure(0, weight=1)
    
    text_widget.insert('1.0', data1)
    text_widget.insert('end', '\n')
    
    data2 = data1.encode().decode('unicode-escape')
    text_widget.insert('end', data2)
    
    print(str(int(text_widget.index('end-1c').split('.')[0])))
    
    root.mainloop()
    
[/code]

この時、行数は10でした。(最後の空行が含まれるのでしょう)  
[![Tkinter Text widget
sample](https://i.stack.imgur.com/fgpoW.png)](https://i.stack.imgur.com/fgpoW.png)


CC BY-SA 4.0
2019-07-26T07:46:51.497
56913
2019-07-29T04:22:14.753
2019-07-29T04:22:14.753
26370
26370
56911
answer