実現したいこと
tkinterにて、ラベルに表示する文字列を、既定の文字数を超えたら末尾を「...」で省略して表示したいのですが、方法がわかりません。
今回の例では、以下の要件を満たしたラベルを実装したいと思っています。
・ラベルを2行まで表示することとする
・wraplength
でラベル幅に合わせて改行し、2行を超える場合は、2行目の末尾を「...」に変えて表示
該当のソースコード
Python
1import tkinter as tk 2 3app = tk.Tk() 4 5w = 25 6lbl = tk.Label(app, text="文字列文字列文字列文字列文字列文字列文字列文字列文字列...", width=w, 7 wraplength=int(w*140/20), anchor=tk.W, justify=tk.LEFT) 8lbl.grid(row=0, column=0) 9 10app.mainloop()
試したこと
フォントを游明朝 Demibold
とし、
font.measure
メソッドで文字列長さを算出しました。
折り返し位置に指定したwraplength
の値は175ピクセルですが、
font.measure
メソッドで算出した1行分の値は252~274(単位不明)でした。
(1)デフォルトのフォントで文字列長さを比較したところ、wraplength
<1行の文字列長となることを確認しました。
Python
1from tkinter import font as tkFont 2 3# 日本語、英語でそれぞれTextウィジェット幅×1行分の長さ 4tex = "文字列文字列文字列文字列文字" 5tex2 = "StringStringStringStringStringStri" 6 7# f = tkFont.Font(family="游明朝 Demibold") 8f = tkFont.nametofont(lbl["font"]) <- ラベルのデフォルトフォントを取得 9# font.measureメソッドで文字列長さを算出 10w1 = f.measure(tex) 11w2 = f.measure(tex2) 12 13# 日本語、英語の1行分の長さ(単位:ピクセル) 14print(w1) 15>168 16print(w2) 17>172 18 19# wraplengthで指定した文字列折り返しの長さ(単位:ピクセル) 20print(w*140/20) 21>175 22
(2)「游明朝 Demibold」フォントで長さを比較しようとしたところ、エラーが発生してしまいました。
Python
1# 游明朝 Demiboldに合わせた1行分の折り返しピクセル数 2wraplength = w * 8 3 4lbl = tk.Label(app, text=tex2, width=w, font=("游明朝 Demibold", 10, ""), 5 wraplength=wraplength, anchor=tk.W, justify=tk.LEFT) 6font = tkFont.nametofont("游明朝 Demibold") 7 8>> _tkinter.TclError: named font 游明朝 Demibold does not already exist 9
補足情報(FW/ツールのバージョンなど)
Windows11
Python 3.9.7
tk 8.6.11
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/06 13:01 編集
2022/05/06 17:03 編集
2022/05/06 19:01
2022/05/07 03:30 編集
2022/05/07 19:25
2022/05/08 02:41 編集
2022/05/08 10:41 編集
2022/05/08 03:16
2022/05/08 10:17 編集
2022/05/08 11:29 編集
2022/05/10 12:34
2022/05/11 03:34 編集
2022/05/12 11:50