🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Tkinter

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

ウィジェット

ウィジェットとはユーザインタフェイスの要素(GUI widget)であるか、もしくは、独立した比較的サイズの小さいソフトウェアアプリケーション(desktop widget)のことを指します。

Python

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

Q&A

解決済

1回答

7746閲覧

【tkinter】フレーム内のウィジェット均等配置について【Python】

netz-eng

総合スコア105

Tkinter

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

ウィジェット

ウィジェットとはユーザインタフェイスの要素(GUI widget)であるか、もしくは、独立した比較的サイズの小さいソフトウェアアプリケーション(desktop widget)のことを指します。

Python

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

0グッド

0クリップ

投稿2020/12/28 16:36

編集2020/12/29 07:16

フレーム内のウィジェットを均等に配置したい

独学でGUIの勉強をしています。
イメージ説明
図のように、大きなラベルフレームの中にフレーム1、2を入れ、それぞれの中にLabelとEntryをgridしているのですが、デザインが思ったようになりません。

解消したい問題点は2点です。
1.フレーム1内にgridした同じ行内のEntryウィジェットを、フレーム横幅に対して均等な長さで配置したい

2.フレーム1の下により横幅の大きいフレーム2を配置しており、フレーム1自体の横幅はフレーム2に合わせて拡張されるが、フレーム1内にgridしたウィジェットの横幅は元のままになっている(padx=5で右端まで伸びているはずのEntry3が、拡張できていない)

解決法に心当たりのある方、ご回答よろしくお願いします。

該当のソースコード

python

1import tkinter as tk 2from tkinter import ttk 3import tkinter.font as font 4from tkinter.scrolledtext import ScrolledText 5 6#tk 7root = tk.Tk() 8root.focus_force() 9root.resizable(False, False) 10root.title("APP") 11 12 13# 画面ぼやけ対策 14import ctypes 15try: 16 ctypes.windll.shcore.SetProcessDpiAwareness(True) 17except: 18 pass 19 20# ============================================================================= 21# 事前準備 22pad = {"padx":5, "pady":5} 23we = tk.W + tk.E 24fon = font.Font(root, size=10) 25 26LFrameStyle = ttk.Style() 27LFrameStyle.theme_use("default") 28LFrameStyle.configure("Dict.TLabelframe", background="gray94") 29LFrameStyle.configure("Dict.TLabelframe.Label", font=("", "12"), background="gray94", foreground="black", relief="ridge") 30 31 32# フレーム 33fra_Label = ttk.LabelFrame(root, labelanchor="nw", text="Label Frame", style="Dict.TLabelframe") 34 35fra1 = tk.Frame(fra_Label, cnf=pad, bg="IndianRed1") 36fra2 = tk.Frame(fra_Label, cnf=pad, bg="steelblue") 37 38# ============================================================================= 39# フレーム① 40lbl1 = ttk.Label(fra1, background="IndianRed1", text="Label 1", font=fon) 41lbl1.grid(row=0, column=0, cnf=pad, sticky=we) 42 43ent1 = tk.Entry(fra1, width=40, font=fon) 44ent1.insert(tk.END, "Entry 1") 45ent1.grid(row=1, column=0, cnf=pad, sticky=we) 46 47lbl2 = ttk.Label(fra1, background="IndianRed1", text="Label 2", font=fon) 48lbl2.grid(row=2, column=0, cnf=pad, sticky=we) 49ent2_1 = tk.Entry(fra1, font=fon) 50ent2_1.insert(tk.END, "Entry 2") 51ent2_1.grid(row=3, column=0, cnf=pad, sticky=we) 52 53ent2_2 = tk.Entry(fra1, font=fon) 54ent2_2.grid(row=3, column=1, cnf=pad, sticky=we) 55 56lbl3 = ttk.Label(fra1, background="IndianRed1", text="Label 3", font=fon) 57lbl2.grid(row=4, column=0, cnf=pad, sticky=we) 58 59ent3 = ScrolledText(fra1, height=5, font=fon) 60ent3.insert(tk.END, "Entry 3") 61ent3.grid(row=5, columnspan=2, cnf=pad, sticky=we) 62 63 64# ================================================================================= 65# フレーム② 66lbl4 = ttk.Label(fra2, background="steelblue", text="Label 4", font=fon) 67lbl4.grid(row=0, column=0, cnf=pad, sticky=we) 68 69ent4_1 = tk.Entry(fra2, font=fon) 70ent4_1.insert(tk.END, "Entry 4") 71ent4_1.grid(row=1, column=0, cnf=pad, sticky=we) 72 73ent4_2 = tk.Entry(fra2, font=fon) 74ent4_2.grid(row=1, column=1, cnf=pad, sticky=we) 75 76ent4_3 = tk.Entry(fra2, font=fon) 77ent4_3.grid(row=1, column=2, cnf=pad, sticky=we) 78 79ent4_4 = tk.Entry(fra2, font=fon) 80ent4_4.grid(row=1, column=3, cnf=pad, sticky=we) 81 82 83 84# ============================================================================= 85# フレーム綴じる 86 87fra1.columnconfigure([1, 3, 5], weight=1) 88fra1.rowconfigure([0, 1, 2], weight=1) 89fra1.pack(expand=True, fill="x", padx=10) 90 91fra2.columnconfigure([1, 3, 5], weight=1) 92fra2.rowconfigure([0, 1, 2], weight=1) 93fra2.pack(expand=False, fill="x", padx=10) 94 95fra_Label.columnconfigure([1, 3, 5], weight=1) 96fra_Label.rowconfigure([0, 1, 2], weight=1) 97fra_Label.pack(expand=False, fill=tk.BOTH, padx=10, pady=10) 98 99 100# ============================================================================= 101root.mainloop() 102

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

Windows10
Python 3.8.3
tk 8.6.10

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

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

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

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

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

teamikl

2020/12/29 00:14

コードを実行するとエラーが出ましたが、 掲載のコードは実行したのと同じですか?
netz-eng

2020/12/29 07:07

ご返信ありがとうございます。 ご指摘の通り、掲載したコードには  from tkinter.scrolledtext import ScrolledText の宣言が抜けておりました。 申し訳ありません、訂正しておきます!
guest

回答1

0

ベストアンサー

現状の設定(row/column configure)では、
グリッドのセルの横幅は、何も指定しなければ均等になります。

セルに格納するウィジェットに応じて伸長しますが、
ウィジェットにwidth指定がある場合は、最低限その幅を確保するので、
均衡を崩す原因になってます。

問題点:

  • ent1 の width
  • 右端の余白 -> column 5

他の問題点

  • w が未定義 → we
  • ScrolledText が未定義

diff

1 2# import 忘れ 3+ from tkinter.scrolledtext import ScrolledText 4 5# 左端が均等にならない原因 width 6- ent1 = tk.Entry(fra1, width=40, font=fon) 7+ ent1 = tk.Entry(fra1, font=fon) 8 9# 未定義の変数、多分 `we` 10- ent3.grid(row=5, columnspan=2, cnf=pad, sticky=w) 11+ ent3.grid(row=5, columnspan=2, cnf=pad, sticky=we) 12 13# grid の設定1 14- fra1.columnconfigure([1, 3, 5], weight=1) 15- fra1.rowconfigure([0, 1, 2], weight=1) 16+ fra1.columnconfigure([0, 1], weight=1) 17+ fra1.rowconfigure([5], weight=1) 18 19# gridの設定2、column=5 が右端の余白の原因 20- fra2.columnconfigure([1, 3, 5], weight=1) 21- fra2.rowconfigure([0, 1, 2], weight=1) 22+ fra2.columnconfigure([0, 1, 2, 3], weight=1) 23+ fra2.rowconfigure([0, 1], weight=1) 24 25# fra_Label は pack() で配置する為、grid 用の設定は不要 26- fra_Label.columnconfigure([1, 3, 5], weight=1) 27- fra_Label.rowconfigure([0, 1, 2], weight=1) 28

投稿2020/12/29 00:42

teamikl

総合スコア8738

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

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

netz-eng

2020/12/29 07:15

ご回答ありがとうございます。 添削していただいたコードで、無事求めていた画面構成にすることができました! (未定義の部分は、質問文を編集しておきます。ご指摘ありがとうございます) 今までほぼコピー&ペーストでcolumn/rowconfigureを使っていたので、今回ようやく正しい使い方を学べました。 一点お尋ねしたいのですが、fra1.rowconfigure([5], weight=1) の部分で第一引数が[5]となっているのは、何故ですか? この部分をコメントアウトして実行してもGUIの見た目が変わらなかったので、何か意味があればお教え願いたいです。
teamikl

2020/12/29 09:25

row=5 のScrolledText のセルの縦幅が伸縮可能かどうかですが、 リサイズ自体を禁止されてるようなので、不要なら設定しなくても大丈夫です。 そこまでコードを精査してなかったので、リサイズ無効は想定してなくて 縦幅が長くなるウィジェットだから縦の伸縮を有効にしておこうかなくらいで変更しましたが、 実行に差し支えないなら、row設定を後々追加したい場合を想定して、 保守用途にコードを残すみたいな考え方もあります。 ※ 実際にリサイズ時に縦幅を伸縮可能にするには、stickyで縦も設定する他、 その親のフレームのレイアウト設定等も変更する必要があります。
netz-eng

2020/12/30 05:20

なるほど、わかりました。もしリサイズすることがあれば、stickyやフレーム設定は見落としてしまいそうなので覚えておきます。 ありがとうございます^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問