TKGは暇を持て余す

高時給バイトのフリーターしながらゆるゆると生きている頑張らない系趣味日記

tkinterのtextで最後の1行だけ削除する

たかぎです。

 

tkinterでツール制作をしていたのですが、テキストボックスの操作で思いの外つまずいたので備忘録として残しておきます。ボタンに紐づけたイベントでテキストボックスの中の1行を削除したかったのですが、検索するとテキストボッコスの全削除については色々なサイトに載っているものの、最後の1行あるいは特定の1行を削除しようとするとこれが欲しい情報にたどり着けず難儀しました。

  1. object.delete('1.0','end -1c')

全体削除はこんな感じですね。どこにでも載ってます。1行削除についても簡単なインデックス指定の方法があるかと思いきや色々な日本語のブログを探しても方法が載っていません。なので自分でまとめることにしました。結論から言うと改行の数もしくはカーソルのインデックス情報から現在の行数を計算して特定行を削除する若干回りくどい方法です。

まずは現在の行数を計算する方法から。これは簡単で

す。

  1.    texts = object.get('1.0','end -1c')
  2.    count_lines = texts.count('\n')+1

get()を使ってテキストボックスオブジェクトの文字列を取得して改行コード\nが何個あるかを数えます。改行が1個なら全体では2行のテキストのはずです。

  1.     object.delete(f'{count_lines}.0', f'{count_lines}.end')

 そのうえで最終行0文字目から最終行の終わりまでを削除すれば、最後の1行のみ削除出来ます。ただ、これだとその行に文字列が無い場合は何も起こりません。

例えば上の写真のような状態の場合、たちつてとの次の行にカーソルがありますが1行削除しようと思ったら消したいのは「たちつてと」の行になるのが普通だと思います。この場合はカーソル位置で分岐させる事で解決しました。

 

  1.     pos = object.index('insert')

 indexメソッドの引数にinsertを渡してカーソル位置を取得(textのメソッドについては調べてみてください)するとx.yの形で座標がstrで返ってくるのでカーソルが行の先頭にある場合つまりx.0の場合には一つ前の行全体を削除するようにしました。全体としてはこんな感じです。特定行の削除についても同じ要領になると思います。

 

  1.         pos = object.index('insert')
  2.         text = object.get('1.0', 'end -1c')
  3.         count_lines = text.count('\n')+1
  4.         if '.0' in pos:
  5.             object.delete(f'{int(count_lines)-1}.0', f'{count_lines}.0')
  6.         else:
  7.             object.delete(f'{count_lines}.0', f'{count_lines}.end')

 やっていること自体は非常に初歩的で簡単なのでわざわざ紹介するまでもないのですが、問題は「簡単でシンプルな方法が無いという情報がどこにもない」ことでした。無いもんは無いってはっきり言ってくれればどうにでも出来るのですが、自分の探し方が悪いせいかと思って無駄な時間を使いました…

もしこの記事が同じところで困っている誰かの役に立てば幸いです。