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

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

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

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

Tkinter

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

Python

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

Q&A

解決済

1回答

1029閲覧

Pythonのtkinterのレイアウトが上手くいかない。

kurosukee

総合スコア1

Python 3.x

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

Tkinter

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

Python

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

0グッド

0クリップ

投稿2022/11/25 14:06

前提

先日からtkinterの勉強を始めたのですが、うまくいかなく困っています。

実現したいこと

  • ラジオボタンを左側に配置し、右側にファイル参照を置きたい。

該当のソースコード

Python

1import tkinter 2from tkinter import * 3from tkinter import ttk 4from tkinter import filedialog 5from tkinter import messagebox 6import os 7 8 9# ファイルの参照処理 10def click_refer_button(): 11 fTyp = [("","*")] 12 iDir = os.path.abspath(os.path.dirname(__file__)) 13 filepath = filedialog.askopenfilename(filetypes = fTyp, initialdir = iDir) 14 filepath.set(filepath) 15 16 17# 出力処理 18def click_export_button(): 19 path = file_path.get() 20 21def rb1_clicked(): 22 print(flg1.get()) 23 24if __name__ == '__main__': 25 # ウィンドウを作成 26 root = tkinter.Tk() 27 root.title("test") 28 root.geometry("500x500") 29 30 flg1 = StringVar() 31 flg1.set('0') 32 33 #グループB用変数 34 flg2 = StringVar() 35 36 #ラジオ1(グループA) 37 rb1 = ttk.Radiobutton(root,text='1',value=0,variable=flg1,command=rb1_clicked) 38 rb1.grid(row=1,column=0) 39 40 #ラジオ2(グループA) 41 rb2 = ttk.Radiobutton(root,text='2',value=1,variable=flg1,command=rb1_clicked) 42 rb2.grid(row=2,column=0) 43 44 #ラジオ3(グループA) 45 rb3 = ttk.Radiobutton(root,text='3',value=2,variable=flg1,command=rb1_clicked) 46 rb3.grid(row=3,column=0) 47 48 # Frame1の作成 49 frame1 = ttk.Frame(root, padding=10) 50 frame1.grid() 51 52 # 「ファイル」ラベルの作成 53 s = StringVar() 54 s.set('ファイル名:') 55 label1 = ttk.Label(frame1, textvariable=s) 56 label1.grid(row=0, column=1) 57 58 # 参照ファイルのパスを表示するテキストボックスの作成 59 file_path = StringVar() 60 filepath_entry = ttk.Entry(frame1, textvariable=file_path, width=30) 61 filepath_entry.grid(row=0, column=2) 62 63 # 参照ボタンの作成 64 refer_button = ttk.Button(frame1, text=u'参照', command=click_refer_button) 65 refer_button.grid(row=0, column=3) 66 67 # Frame2の作成 68 frame2 = ttk.Frame(root, padding=10) 69 frame2.grid() 70 71 # テキスト出力ボタンの作成 72 export_button = ttk.Button(frame2, text='開始', command=click_export_button, width=10) 73 export_button.grid(row=4, column=0) 74 75 # テキスト出力ボックスの作成 76 textboxname = StringVar() 77 textboxname.set('\n\n結果 ') 78 label3 = ttk.Label(frame2, textvariable=textboxname) 79 label3.grid(row=5, column=0) 80 textBox = Text(frame2, width=50) 81 textBox.grid(row=6, column=0) 82 83 # ウィンドウを動かす 84 root.mainloop()

試したこと

row や column の値をいろいろと変更してみましたが配置は変わるのですが、思った通りに動いてくれません。

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

実行結果です。
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

pack で左右に配置する方法

左フレーム、右フレームを作り、pack の side オプションに tk.LEFT, tk.RIGHT を設定


grid で左右に配置する方法

左 column=0 右 column=1 に設定

但し、結果の下のテキスト欄が column=0 の最大幅となる為、
column=1 の開始は、テキスト欄より右になります。
ラジオボタンとの間には空白が出来てしまう為、
frame2 に columnspan=2 を設定する等して調整。

更に、row=1 はファイル入力欄の縦幅が最大値になるので、
ラジオボタンの縦の間隔が不規則になります。
ファイル入力にラジオボタン3つ分の rowspan=3 を設定します。

frame1, grame2 の grid を以下の様に変更

python

1 frame1.grid(row=1, column=1, rowspan=3) 2 3 frame2.grid(columnspan=2)

イメージ説明

※ このウィジェット構造では、gridで配置する場合
ラジオボタンが増えると、rowspanの値も増やさないといけなくなります。
ラジオボタンの横に他のウィジェットを揃える必要が無ければ、
フレームにラジオボタンを配置してから、親ウィジェットにgridで配置する等
コードを保守しやすいように工夫します。


packでの配置 サンプルコード

投稿2022/11/26 02:02

編集2022/11/26 07:02
teamikl

総合スコア8664

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

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

kurosukee

2022/11/26 05:09

先述のコードのようにラジオボタン一つひとつに column=0を設定してはならないということでしょうか? またどのウィジェットをcolumn=0に設定すればよいのでしょうか?
teamikl

2022/11/26 06:11

> ラジオボタン一つひとつに column=0を設定してはならないということでしょうか? 状況によりますが、今回の質問では まず、ラジオボタン3つの右側にウィジェットを配置する場合、 右側のウィジェットには rowspan=3 と3列分使う設定が必要になります。 この 3 という数値はラジオボタンの個数によって変わってくるので この様な数値は「マジックナンバー」と呼ばれていて、不具合の原因となりやすい箇所で コードを保守しやすくする為には、出来るだけ避けるように設計します。 今回の場合であれば、ラジオボタン3つも一つのフレーム上に配置すれば rowspan の設定は不要になります。コードの記述量は少し増えて冗長に思われるかもしれませんが 「ラジオボタンの数を増やすと rowspanの値も変更しないとレイアウトが崩れる」 という状況を回避できます。 > どのウィジェットをcolumn=0に設定すればよいのでしょうか? 回答に書いたコードの通りです。 grid では左側から順に詰めるので、 左右に配置したい場合は、columnを2分割して 左に配置したいウィジェットに column=0 右に配置したいウィジェットを column=1 とします。
kurosukee

2022/11/26 07:07

何度も申し訳ないです。 目的のように配置できたのですが、このコード(variable=flg1など)ではラジオボタンはフレーム化できていないのでしょうか? またフレーム化のやり方を教えていただけますでしょうか。
teamikl

2022/11/26 07:17

> ラジオボタンはフレーム化できていないのでしょうか? ラジオボタンのグループを纏めてフレーム上に配置、という意図なら可能です。 一纏めにしたグループをクラス化すると良いかもしれません。 pack で配置する場合のサンプルコードを解答に載せたので参考にして見て下さい。
kurosukee

2022/11/26 07:30

ご丁寧にありがとうございます! 非常にわかりやすかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問