質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

【tkinter】ラベルに表示する文字列が、既定の文字数を超えた場合は末尾を「...」で省略させる方法【Python】

netz-eng
netz-eng

総合スコア94

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2回答

1評価

1クリップ

205閲覧

投稿2022/05/06 08:08

編集2022/05/12 20:50

実現したいこと

tkinterにて、ラベルに表示する文字列を、既定の文字数を超えたら末尾を「...」で省略して表示したいのですが、方法がわかりません。

今回の例では、以下の要件を満たしたラベルを実装したいと思っています。
ラベルを2行まで表示することとする
wraplengthでラベル幅に合わせて改行し、2行を超える場合は、2行目の末尾を「...」に変えて表示

(元の文字列をそのまま表示した場合)
イメージ説明
(理想)
イメージ説明

該当のソースコード

Python

import tkinter as tk app = tk.Tk() w = 25 lbl = tk.Label(app, text="文字列文字列文字列文字列文字列文字列文字列文字列文字列...", width=w, wraplength=int(w*140/20), anchor=tk.W, justify=tk.LEFT) lbl.grid(row=0, column=0) app.mainloop()

試したこと

フォントを游明朝 Demiboldとし、
font.measureメソッドで文字列長さを算出しました。

折り返し位置に指定したwraplengthの値は175ピクセルですが、
font.measureメソッドで算出した1行分の値は252~274(単位不明)でした。

(1)デフォルトのフォントで文字列長さを比較したところ、wraplength<1行の文字列長となることを確認しました。

Python

from tkinter import font as tkFont # 日本語、英語でそれぞれTextウィジェット幅×1行分の長さ tex = "文字列文字列文字列文字列文字" tex2 = "StringStringStringStringStringStri" # f = tkFont.Font(family="游明朝 Demibold") f = tkFont.nametofont(lbl["font"])   <- ラベルのデフォルトフォントを取得 # font.measureメソッドで文字列長さを算出 w1 = f.measure(tex) w2 = f.measure(tex2) # 日本語、英語の1行分の長さ(単位:ピクセル) print(w1) >168 print(w2) >172 # wraplengthで指定した文字列折り返しの長さ(単位:ピクセル) print(w*140/20) >175

(2)「游明朝 Demibold」フォントで長さを比較しようとしたところ、エラーが発生してしまいました。

Python

# 游明朝 Demiboldに合わせた1行分の折り返しピクセル数 wraplength = w * 8 lbl = tk.Label(app, text=tex2, width=w, font=("游明朝 Demibold", 10, ""), wraplength=wraplength, anchor=tk.W, justify=tk.LEFT) font = tkFont.nametofont("游明朝 Demibold") >> _tkinter.TclError: named font 游明朝 Demibold does not already exist

補足情報(FW/ツールのバージョンなど)

Windows11
Python 3.9.7
tk 8.6.11

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。