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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

Q&A

解決済

1回答

2937閲覧

Python3 Tkinter ウィジェット間に罫線を表示してかつウィジェットの開始端を揃えたい

person

総合スコア223

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

0グッド

1クリップ

投稿2020/06/29 10:40

編集2020/06/29 10:48

Tkinterでウィジェット間に罫線を表示したいので、次のようにフレームを配置しました。

Python

1import tkinter as tk 2 3win = tk.Tk() 4 5win.rowconfigure(0, weight=1) 6win.columnconfigure(0, weight=1) 7 8f0 = tk.Frame(win) 9f0.grid(sticky="nsew") 10 11f0.rowconfigure((0,1,2), weight=1) 12f0.columnconfigure(0, weight=1) 13 14f1 = tk.Frame(f0, relief="solid", bd=1) 15f1.grid(row=0, column=0, sticky="nsew") 16f2 = tk.Frame(f0, relief="solid", bd=1) 17f2.grid(row=1, column=0, sticky="nsew") 18f3 = tk.Frame(f0, relief="solid", bd=1) 19f3.grid(row=2, column=0, sticky="nsew") 20 21f1.rowconfigure(0, weight=1) 22f1.columnconfigure(1, weight=1) 23f2.rowconfigure(0, weight=1) 24f2.columnconfigure(1, weight=1) 25f3.rowconfigure(0, weight=1) 26f3.columnconfigure(1, weight=1) 27 28l1 = tk.Label(f1, text="a"*10) 29l1.grid(row=0, column=0, sticky="nsew") 30l2 = tk.Label(f2, text="a"*20) 31l2.grid(row=0, column=0, sticky="nsew") 32l3 = tk.Label(f3, text="a"*30) 33l3.grid(row=0, column=0, sticky="nsew") 34 35e1 = tk.Entry(f1) 36e1.grid(row=0, column=1, sticky="nsew") 37e2 = tk.Entry(f2) 38e2.grid(row=0, column=1, sticky="nsew") 39e3 = tk.Entry(f3) 40e3.grid(row=0, column=1, sticky="nsew") 41 42win.mainloop()

実行結果

実行結果

ここでエントリ(テキストボックス)の開始端を3つとも揃えたいのですが、
行ごと(可能であれば格子状)に罫線を表示しながら揃えることができません。

理想としては、下のコードのようにラベルテキストが最も長いものの末尾に揃えたいです。

可能でしょうか?

外枠の罫線表示でウィジェットを揃えて配置。

Python

1import tkinter as tk 2 3win = tk.Tk() 4 5win.rowconfigure(0, weight=1) 6win.columnconfigure(0, weight=1) 7 8f0 = tk.Frame(win) # フレームの内側にreliefは設定できない・・・? 9f0.grid(sticky="nsew") 10 11f0.rowconfigure((0,1,2), weight=1) 12f0.columnconfigure(1, weight=1) 13 14l1 = tk.Label(f0, text="a"*10) 15l1.grid(row=0, column=0, sticky="nsw") 16l2 = tk.Label(f0, text="a"*20) 17l2.grid(row=1, column=0, sticky="nsw") 18l3 = tk.Label(f0, text="a"*30) 19l3.grid(row=2, column=0, sticky="nsw") 20 21e1 = tk.Entry(f0) 22e1.grid(row=0, column=1, sticky="nsew") 23e2 = tk.Entry(f0) 24e2.grid(row=1, column=1, sticky="nsew") 25e3 = tk.Entry(f0) 26e3.grid(row=2, column=1, sticky="nsew") 27 28win.mainloop()

実行結果
実行結果2

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

簡単な方法は、各列を width で固定幅にして全て個別の 枠付きFrame に入れる方法です。

Label 自体にも borderwidthrelief 指定が可能ですが、
横幅を揃える為に `sticky' 指定すると中央に来てしまう為、
ラベルの文字を左寄せにする為には、Frame を挟むなどの追加で対策が必要になってしまいます。

relief を用いる罫線表示の場合、もう一つ問題があって
各セルがボーダーを持つため、ボーダーの太さが二重になるというものです。
これの対策としては、背景色をボーダー色として、padx, pady で片側のみ余白を作る方法があります。
(サイズ1の罫線を表示させたい場合)

追記

イメージ説明

python

1import tkinter as tk 2 3border_color = "black" 4grid_options = dict(padx=(1,0), pady=(1,0), sticky="nwse") 5 6root = tk.Tk() 7frame = tk.Frame(root, bg=border_color) 8frame.pack(fill=tk.BOTH, expand=True) 9frame.grid_columnconfigure(1, weight=True) 10 11bgcolor = root.cget("bg") 12 13for row, num in enumerate([3, 6, 9]): 14 field = tk.Frame(frame, bg=bgcolor, relief=tk.SOLID) 15 label = tk.Label(field, text="a" * num) 16 label.pack(fill=tk.X, side=tk.LEFT) 17 field.grid(row=row, column=0, **grid_options) 18 entry = tk.Entry(frame) 19 entry.grid(row=row, column=1, **grid_options) 20 frame.grid_rowconfigure(row, weight=True) 21 22root.mainloop()

他の方法

  • 自分でレイアウトコンテナのクラスを実装する。→ 問題点: 実装方法のサンプルがほとんどない
  • 既存のライブラリを探して使う。 pypi.org「table」「grid」を検索

 軽く探してみましたが、特にこれというものは有りませんでした。
エクセルの様なスプレッドシード的な実装はありますが、
目的が見栄えだけの場合は少し冗長になります。

投稿2020/06/29 14:42

編集2020/06/29 14:59
teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問