6

親の幅と同期してサイズを変更するワードラップを使用して複数行のラベルを作成することは可能ですか?つまり、メモ帳ウィンドウの幅を変更したときのメモ帳のワードラップ動作。

ユースケースは、テキストをクリップしたりスクロールバーに頼ったりせずに、複数行のテキスト(指示)のブロック全体を表示する必要があるダイアログです。親コンテナには、狭い幅に対応するのに十分な垂直方向のスペースがあります。

私はTkinterラベルとメッセージウィジェットとttkラベルウィジェットを試してきましたが成功しませんでした。ピクセルの折り返しの長さの値をハードコーディングする必要があるようですが、テキストがコンテナの右端に到達したときにこれらのコントロールに自動ワードラップを設定する必要があります。確かに、Tkintersジオメトリマネージャーは、ラベルのサイズを自動変更し、それに応じてラップレングス値を更新するのに役立ちますか?

代わりにテキストウィジェットを見るべきですか?もしそうなら、テキストウィジェットの境界線を非表示にして、ワードラップ付きの複数行のラベルとして使用できるようにすることはできますか?

これは、私が上で説明したことをどのように行うかのプロトタイプです。テキストウィジェットとStackoverflowに関する次の投稿を使用するというBryanOakleyのヒントに触発されました。Python のtkinterで、マウスでテキストを選択できるようにラベルを作成するにはどうすればよいですか?

from Tkinter import *
master = Tk()

text = """
If tkinter is 8.5 or above you'll want the selection background to appear like it does when the widget is activated. Comment this out for older versions of Tkinter.

This is even more text.

The final line of our auto-wrapping label that supports clipboard copy.
""".strip()

frameLabel = Frame( master, padx=20, pady=20 )
frameLabel.pack()
w = Text( frameLabel, wrap='word', font='Arial 12 italic' )
w.insert( 1.0, text )
w.pack()

# - have selection background appear like it does when the widget is activated (Tkinter 8.5+)
# - have label background color match its parent background color via .cget('bg')
# - set relief='flat' to hide Text control borders
# - set state='disabled' to block changes to text (while still allowing selection/clipboard copy)
w.configure( bg=master.cget('bg'), relief='flat', state='disabled' )

mainloop()
4

4 に答える 4

3

Messageウィジェットを使用する:

メッセージウィジェットはラベルの変形であり、複数行のメッセージを表示するように設計されています。メッセージウィジェットはテキストを折り返し、その幅を調整して特定のアスペクト比を維持できます。

于 2016-05-11T11:07:40.910 に答える
2

いいえ、ラベルを自動ワードラップするためのTkに組み込まれた機能はありません。ただし、ラベルのイベントにバインドし<Configure>、ラップの長さを調整することで実行できます。このバインディングは、ラベルウィジェットのサイズが変更されるたびに発生します。

あなたが提案するように、他のオプションはテキストウィジェットを使用することです。必要に応じて、境界線を完全にオフにすることができます。これは、単語でラップされた説明テキストが必要な場合に常に私の選択でした。

于 2010-10-25T10:35:25.157 に答える
2

コードは次のとおりです。

entry = Label(self, text=text,
    anchor=NW, justify=LEFT,
    relief=RIDGE, bd=2)
def y(event, entry=entry):
  # FIXME: make this a global method, to prevent function object creation
  # for every label.
  pad = 0
  pad += int(str(entry['bd']))
  pad += int(str(entry['padx']))
  pad *= 2
  entry.configure(wraplength = event.width - pad)
entry.bind("<Configure>", y )
于 2012-04-03T20:38:05.463 に答える
2

一部の人々によって提案されたtkinter.Messageウィジェットは、TTKスタイルを使用していません。つまり、TTK(テーマ)インターフェイス内のゴミのように見えます。

TTKテーマの背景色と前景色をtkinter.Message(そのスタイルオブジェクトからアクティブなテーマの前景色と背景色をインスタンス化ttk.Style()して要求することにより)手動で適用することもできますTLabelが、それだけの価値はありません...古代のMessageウィジェットには利点がないためです。 TTKのレギュラーttk.Label

ウィジェットには、tkinter.Message折り返すまでのピクセル数を定義する「アスペクト比」プロパティがあります。

ttk.Label代わりに、単語が折り返されるまでのピクセル数を決定するプロパティwraplength=があります。また、そのプロパティを使用して、正確な希望に合わせてカスタマイズする必要がanchor=あります。justify=これらのプロパティを使用すると、ラベルを古いメッセージウィジェットと同じように動作させることができます。

例: ttk.Label(root, text="foo", wraplength=220, anchor=tkinter.NW, justify=tkinter.LEFT)。幅220ピクセルの後にテキストを永続的に折り返す、美しいスタイルのラベルを作成します。

ラップレングスを自動更新するのは?さて、あなたはにアタッチする必要があります<Configure>人々が言っ​​ているようにイベント...ただし、完全に流動的なウィンドウ(すべてのコンテンツに合わせてサイズが変更される)、または流動的でラベルを含むグリッド/フレームがある場合、その方法で自動的に計算することはできません、ラベルが大きくなりすぎると、親のWINDOW/CONTAINER自体が拡張するためです。つまり、ラベルは常に、すべてのテキストに合わせるために必要な最大幅にサイズ変更されます。したがって、ラップ長を自動的に更新できるのは、ラベル自体が拡大できる幅に何らかの制約がある場合のみです(親コンテナーが固定サイズ/最大サイズであるか、それ自体が固定サイズ/最大サイズである場合)。その場合は、確かに、configureを使用して新しい折り返し番号を計算し、テキストが常に折り返されるようにすることができます...ただし、t7koによるサンプルコードは壊れており、もはや有効ではありません。fyiだけです。

于 2019-10-14T18:32:25.033 に答える