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

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

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

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

Q&A

解決済

1回答

1821閲覧

grid と pack でのレイアウトや、ボタンのサイズについて

nkfrom_asu

総合スコア10

Tkinter

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

0グッド

0クリップ

投稿2022/04/07 07:50

前提

grid と pack でレイアウトを整えているのですが、調整方法がわかりません。
また、ボタンのサイズについてもお伺いしたいです。

実現したいこと

Yellow と # のラジオボタンを揃えたい。
ボタンを正確な正方形にしたい。

該当のソースコード

Python

1import tkinter 2from tkinter import scrolledtext 3 4root = tkinter.Tk() 5 6radio_var = tkinter.IntVar() 7radio_var.set(0) 8 9frame_widget = tkinter.Frame(root) 10frame_color = tkinter.Frame(frame_widget) 11 12text = scrolledtext.ScrolledText(frame_widget, width = 20, height = 4) 13bu = tkinter.Button(frame_widget, text = "Export") 14radio1 = tkinter.Radiobutton(frame_widget, value = 0, variable = radio_var, text = "Yellow") 15radio2 = tkinter.Radiobutton(frame_widget, value = 1, variable = radio_var, text = "White") 16text.grid (columnspan = 2, row = 0) 17bu.grid(columnspan = 2, row = 1, sticky = tkinter.E + tkinter.W) 18radio1.grid(column = 0, row = 2) 19radio2.grid(column = 1, row = 2) 20frame_color.grid(columnspan = 2, row = 3) #調整したい部分 1 21 22radio3 = tkinter.Radiobutton(frame_color, value = 2, variable = radio_var, text = "#") 23en_color = tkinter.Entry(frame_color, width = 8) 24bu_color = tkinter.Button(frame_color, font=("", 1), width=8, height=8) #調整したい部分 2 25radio3.grid(column = 0, row = 0) 26en_color.grid(column = 1, row = 0) 27bu_color.grid(column = 2, row = 0, padx=4) 28 29frame_widget.pack() 30 31root.mainloop()

イメージ説明

試したこと

frame_color.grid に
sticky = tkinter.W, padx = 9 を追加し、目視では気にならない程度にはできました。
イメージ説明ですが、正確ではないと思うので、よりよい方法があれば知りたいです。

ボタンに関しては、font=("", 1), width=8, height=8 で正方形に見えますが、サイズを大きくすると縦が長くなるため、あまりいい気はしません。

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

pack, grid ではレイアウトマネージャが自動的に座標・サイズを割り当てる為、
minwidth で最小幅をヒントとして設定できるくらいで、任意のサイズ指定はできません。
伸縮の可否・伸縮の方向のみでレイアウトを調整します。
サイズ指定が必要な場合は、place を使いますが固定レイアウトになります。

質問のコードのラジオボタンのレイアウト調整に関しては、
Frame の区切り方に構造的な問題があります。

root frame_widget: Frame text bu radio1 <--- radio2 frame_color: Frame radio3 <--- en_color bu_color

ウィジェットの階層で、radio1 と radio3 は別の親フレームに配置されているため、
grid で揃えることは出来ません。親フレームの配置に依存していまいます。

解決策としては、
フレームは入れ子にせずに、共通のフレーム上にフラットに配置します。

他の案として
部品として再利用したいなどの理由により、どうしてもサブ・フレーム 上に配置したい場合は、
grid の minsize オプションが使えるかもしれませんが、固定レイアウトで配置することになります。
(→ レイアウトの変化に対応しにくいコードになる傾向があります)


もう一点、注意が必要なのは、tkinterでは
文字を表示するウィジェットでは width, height は文字数なので
実際に表示されるサイズは、フォントサイズ依存になります。

正確に正方形のサイズにしたい場合は、
ボタンでの正方形の画像の利用を検討して見て下さい。Buttonに image オプションが有ります。

投稿2022/04/07 08:29

teamikl

総合スコア8664

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

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

nkfrom_asu

2022/04/07 09:15

回答ありがとうございます。 同じフレームに入れたところ、文字数の関係でずれてしまいましたが、 全てのラジオボタンに sticky = tkinter.W を適用し、padx で調整することにより、 frame_color のままでやりたいことが実現できました。 padx の値は目視調整ですが、この点は気にならないので問題ありません。 ボタンの image オプションは知りませんでした。 カラーコードや colorchooser で選択した色のボタンにしたいので、 Pillowで生成した画像を試そうと思います。 ありがとうございました。
teamikl

2022/04/07 09:37

追加情報で、背景色を可変にしたい場合、Pillowで生成しなくても PhotoImage に palette オプションもあります。 (用意する画像の形式がパレット対応の場合のみ。※RGB画像では使えない) PhotoImage で表示領域だけ確保すれば 未描画の部分は透明になるみたいなので、空画像で良さそうです。 image = tk.PhotoImage(data="", width=24, height=24) button = tk.Button(root, image=image, bg="#22eedd")
nkfrom_asu

2022/04/07 10:28

なるほど、こちらのほうがシンプルでよさそうですね。 とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問