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

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

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

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

Q&A

解決済

1回答

1132閲覧

python Widgetを grid で配置する際の動作について

gorio

総合スコア17

Python

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

0グッド

0クリップ

投稿2019/03/28 07:49

Widgetを grid で配置する際の動作について教えてください。
以下のように3つの Button を配置しました。

import tkinter as tk from tkinter.scrolledtext import ScrolledText from tkinter import filedialog class Gui_18_v01(tk.LabelFrame): def __init__(self,master=None): #初期化メソッド super().__init__(master) self.pack() self.create_widgets() def create_widgets(self) : self.button1 = tk.Button(self, width = 11, text="button1", fg='blue') self.button1.grid(column = 1, row = 0) self.button2 = tk.Button(self, width = 11, text="button2", fg='blue') self.button2.grid(column = 1, row = 1) self.button3 = tk.Button(self, width = 11, text="button3", fg='blue') self.button3.grid(column = 1, row = 2) if __name__=='__main__': root_frame = tk.Tk() app = Gui_18_v01(master=root_frame) app.mainloop()

ここに 以下のように ScrolledText を追加すると、Button2 の配置位置 がずれてしまいます。
self.Text1 = ScrolledText(self, background='#ffffff')
self.Text1.grid(row=0, column=5, sticky = 'nsew')

Buttonの位置は元のままでScrolledText を配置することはできますでしょうか。

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

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

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

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

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

t_obara

2019/03/28 08:52

最終的にどの様な配置をご所望なのでしょうか、想定するイメージをご提示いただくと適切な回答を得られやすいかと思います。
gorio

2019/04/01 02:47

反省しています。 質問する際は、分かり易い質問となるように気を付けます。
t_obara

2019/04/01 02:54

反省を表明する必要は特にないとわたしは思いますが、それよりも質問自体編集ができるので、必要な情報を提示する方が良いです。
guest

回答1

0

ベストアンサー

gridはウィジェットを格子状に配置したいときに使います。
質問者さんの意図は必ずしも「格子状の配置」ではない気がします。

・左側に上から等間隔にボタンを3つ並べる
・その右隣にボタンの垂直方向の位置とは無関係にScrolledTextを置く

ではないのですか?以下の例をご覧ください。

... class Gui_18_v01(tk.LabelFrame): def __init__(self, master=None): super().__init__(master) self.pack() self.init1() # self.init2(make_struts=False) # self.init2(make_struts=True) def init1(self): button_frame = tk.Frame(self) button_frame.pack(side=tk.LEFT, anchor=tk.N) self.button1 = tk.Button(button_frame, width=11, text="button1", fg='blue') self.button1.pack(side=tk.TOP) self.button2 = tk.Button(button_frame, width=11, text="button2", fg='blue') self.button2.pack(side=tk.TOP) self.button3 = tk.Button(button_frame, width=11, text="button3", fg='blue') self.button3.pack(side=tk.TOP) self.text1 = ScrolledText(self, background='#ffffff') self.text1.pack(side=tk.LEFT) def init2(self, make_struts): self.button1 = tk.Button(self, width=11, text="button1", fg='blue') self.button1.grid(row=0, column=0) self.button2 = tk.Button(self, width=11, text="button2", fg='blue') self.button2.grid(row=1, column=0) self.button3 = tk.Button(self, width=11, text="button3", fg='blue') self.button3.grid(row=2, column=0) if make_struts: struts = tk.Label(self, text="", height=16) struts.grid(row=3, column=0) self.text1 = ScrolledText(self, background='#ffffff') rowspan = 4 if make_struts else 3 self.text1.grid(row=0, rowspan=rowspan, column=1) ...

init1がpackを用いた配置のもの、init2がgridを使ったものです。

上のコードではinit1により配置をしてますが、結果は次のようになります。

結果1
fig1

gridを用いてself.init2(make_struts=False)とやると結果は次のようになります。

結果2
イメージ説明

これは質問者さんが望む結果ではないはずですが、gridとはこういうものであるという例として挙げました。gridは行方向・列方向に並べたウィジェットの大きさの最大で行・列の大きさを決めその格子の中に各ウィジェットをはめ込みます。ボタン3つ分より大きなScrolledTextを配置すると各ボタンの高さはあまった高さを等分に割り振り配置されることになります。

gridを使ってかつ結果1のようにするには例えばself.init2(make_struts=True)のようにすればできますが、実装をよくご覧ください。3つのボタンの下に不可視のウィジェット(スペースを確保するための柱的なもの=struts)を配置し「高さのつじつま合わせをしている」ことがおわかりでしょうか?このような方法はお勧めできません。

「結果1」のような配置を望むならgridを使うのは止してpackを使う方が自然だと思います。


なお、「ボタン3つ分の高さより小さい高さであるようなScrolledTextを配置する」ならrowspan=2とかrowspan=3を指定したgridでもよいかも知れません。しかしご質問にあるとおりにScrolledTextを生成すると本回答にあるような大きさとなるためpackをお勧めする回答としました。

投稿2019/03/28 11:55

KSwordOfHaste

総合スコア18394

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

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

gorio

2019/04/01 02:52

gridとPackの動き方を教えて頂き、大変助かりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問