web-dev-qa-db-ja.com

Tkinterテキストウィジェットを読み取り専用にする方法はありますか?

それはその属性を持っているようには見えませんが、私にとっては本当に便利でしょう。

48
rectangletangle

Textウィジェットの 状態NORMALからDISABLEDに変更する必要がありますaftertext.insert()またはtext.bind()を入力:

text.config(state=DISABLED)
65
ars
text = Text(app, state='disabled', width=44, height=5)

挿入の前後に状態を変更します。そうしないと更新されません。

text.configure(state='normal')
text.insert('end', 'Some Text')
text.configure(state='disabled')
25
renzowesterbeek

tcl wiki は、この問題を詳細に説明し、3つの可能な解決策をリストしています。

  1. 他の回答で説明されている無効化/有効化のトリック
  2. 挿入/削除イベントのバインディングを置き換えます
  3. (2)と同じですが、別のウィジェットでラップします。

(2)または(3)が望ましいでしょうが、解決策は明らかではありません。ただし、 有効なソリューションはunpythonic wikiで利用可能です

 from Tkinter import Text
 from idlelib.WidgetRedirector import WidgetRedirector

 class ReadOnlyText(Text):
     def __init__(self, *args, **kwargs):
         Text.__init__(self, *args, **kwargs)
         self.redirector = WidgetRedirector(self)
         self.insert = self.redirector.register("insert", lambda *args, **kw: "break")
         self.delete = self.redirector.register("delete", lambda *args, **kw: "break")
20
freakboy3742

非常に簡単な解決策は、次のようにキーを押すと「ブレーク」を返す関数にバインドすることです。

import Tkinter

root = Tkinter.Tk() 

readonly = Tkinter.Text(root)
readonly.bind("<Key>", lambda e: "break")
14
FoxDot

50の評判がないので、 nbro's answerにコメントを追加できません。それにもかかわらず、それはこの答えが属するところです。

あなたのユースケースが本当に簡単な場合、 nbro'stext.bind( '<1>'、lambda event:text.focus_set())コードは Craig McQueen はOS Xでは見られるが、他の人はWindowsやLinuxでは見られない対話性の問題。

OTOH、読み取り専用データにコンテキスト構造がある場合、ある時点でおそらくTkinter.Text.insertpositiontexttaglist)タグの下の読み取り専用のテキストボックスウィンドウに追加します。これは、コンテキストに基づいてデータの一部を目立たせるために行います。タグでマークアップされたテキストは、。Text.tag_config()を呼び出してフォントや色などを変更することで強調できます。同様に、タグでマークアップすると、。Text.tag_bind()を使用してインタラクティブバインディングをアタッチできます。 これらの関数はこちら を使用する良い例があります。 mark_for_paste()関数がNiceの場合、データのコンテキストを理解するmark_for_paste()関数の方がおそらく優れています。

7
cshilton
from Tkinter import *
root = Tk()
text = Text(root)
text.insert(END,"Some Text")
text.configure(state='disabled')
4
sarbjit

ユーザー編集を無効にして許可する場合は、Windowsでこのコードを使用します Ctrl+C 画面テキストのコピーの場合:

def txtEvent(event):
    if(event.state==12 and event.keysym=='c' ):
        return
    else:
        return "break"

txt.bind("<Key>", lambda e: txtEvent(e))
3
Pal

テキストを選択する必要がない場合は、状態を無効にするのが最も簡単な方法です。コピーをサポートするために、外部エンティティ-Button-を使用してジョブを実行できます。ユーザーがボタンを押すたびに、Textの内容がクリップボードにコピーされます。 Tkは、クリップボードの処理をビルド内でサポートしているため( here を参照)、Ctrl-Cの動作をエミュレートするのは簡単です。ログメッセージを作成するコンソールを作成する場合は、さらに進んでEntryを追加して、ユーザーがコピーするログメッセージの数を指定できるようにします。

2
rbaleksandar