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

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

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

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

Python

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

Q&A

解決済

2回答

549閲覧

TkinterのウィジェットをPackで並べる方法

shinobuKouno

総合スコア31

Tkinter

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

Python

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

0グッド

0クリップ

投稿2022/10/24 09:07

前提

TkinterのウィジェットをPackをつかい並べたい

Tkinterのウィジェットをキャンバス内のフレーム内に↓の画像のように並べたいのですが

イメージ説明

↓のようになってしまいます。

イメージ説明

Packで並べる方法を教えてください。

またスクロールバーがメインウィンドウの左側についているのですが、これをキャンバスの右側に
付ける方法を教えてください。

該当のソースコード

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("test")
root.geometry("1800x1200+50+100")

cnv = tk.Canvas(root,
width=1500,
height=900,
bg="blue")
cnv.pack(fill=tk.BOTH, expand=tk.YES)
frm_f = tk.Frame(cnv,
width=1500,height=900,
bg='blue')
cnv.create_window(0,0, window=frm_f, anchor=tk.NW)

ybar = tk.Scrollbar(cnv ,orient=tk.VERTICAL)
xbar = tk.Scrollbar(cnv ,orient=tk.HORIZONTAL)

ybar.pack(side=tk.RIGHT, fill=tk.Y)
xbar.pack(side=tk.BOTTOM, fill=tk.X)

ybar.config(command=cnv.yview)
xbar.config(command=cnv.xview)

cnv.config(yscrollcommand=ybar.set, xscrollcommand=xbar.set)
cnv.config(scrollregion=(0, 0, 2200, 4500))

for i in range(1 ,25):

lbl_a = tk.Label(frm_f, width=8, text=str(i) + '行目のLabel', bg='white') lbl_a.pack(anchor=tk.SW) txt_a = tk.Entry(frm_f, width=11, bg='white', justify=tk.RIGHT) txt_a.pack(side=tk.LEFT) txt_a.insert(0, str(i) + '行目のEntry_A') lst_a = tk.Listbox(frm_f, width=25, selectmode="single", bg='white') lst_a.pack(side=tk.LEFT) txt_b = tk.Entry(frm_f, width=60, bg='white') txt_b.pack(side=tk.LEFT) txt_b.insert(0, str(i) + '行目のEntry_B')

root.mainloop()

ソースコード

試したこと

create_windowでは問題ないのですが、packの使い方を学びたいためpackでお願いします。

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

Python 3.10.5
Tkinter 8.6

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

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

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

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

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

guest

回答2

0

ベストアンサー

packの使い方を学びたいためpackでお願いします。

残念ながら pack での配置では各列の幅を揃えるのを保証できません。
格子状の配置には grid を使いましょう。

出来なくはないが、用途が合わない機能を無理に使おうとして
冗長なコードになる為、学習の題材としては適切ではありません。

レイアウトを自動調整する為に pack, grid を用いるはずが、
用途が合わない部分のコードを自前で実装することになって、かえって手間が増えます。
具体的には、grid なら列の幅を自動で揃えてくれますが、pack ではそれが出来ません。

どうしても pack で実装したい場合は以下のような構造になります

- Frame - Label - Entry_A - lst_a - Entry_B - Frame - Label - Entry_A - lst_a - Entry_B ...

frame は pack で縦方向に並べて
行に当たる Label, Entry, lst, EntryB は frame 上に side 引数を指定して並べます。
注意点は、各列の長さを伸縮不可能・固定サイズにしないと、
格子状に配置した際の各行での列の幅がずれてしまいます。⇛ grid を使ったほうが楽な部分。


スクロールバーがメインウィンドウの左側についているのですが

画像では右側についていますが、pack で並べるのであれば side 引数に RIGHT, LEFT を指定できます。
pack で並べる場合は、呼び出す順序にも注意してください。

もしキャンバスの「左側」に付けたいということであれば、
キャンバス側にも sideを指定 する必要があります。

投稿2022/10/24 09:45

teamikl

総合スコア8664

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

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

shinobuKouno

2022/10/24 13:05

ありがとうございます。 考えを改め、gridにし解決しました スクロールですが、すみません「右」の間違えでした キャンバス側にsideを指定する方法を詳しく教えてください。
teamikl

2022/10/24 16:54

以下のように指定します。 packの場合は呼び出し順序が影響する場合があるので、 左上に配置したいものから順に呼び出します。 ybar.pack(side=tk.LEFT, fill=tk.Y) cnv.pack(fill=tk.BOTH, expand=tk.YES, side=tk.RIGHT) side=tk.RIGHTを付け ybar.pack の後に持ってくる
shinobuKouno

2022/10/25 04:53

ありがとうございます。思い通りの動きができるようになりました。
teamikl

2022/10/25 11:15 編集

補足事項で、大量のウィジェットを配置する場合、 現状くらいの規模なら大丈夫かもしれませんが、更に行数を増やす場合 スペックによってはアプリケーションが重たくなる場合があります。(例: 50行 のところを500等にしてみる) 学習目的なのか実用が目的なのかで、いくつか選択肢がありますが もし、更に行数を増やした表計算ソフトのようなものを作りたい場合は、 現状の実装方法では恐らく行き詰まるので、他の方法も検討してみてください。 - ttk.Treeview を使って擬似的なテーブルを作成する。  ※ 但しセルのインライン編集等は対応してないので、不足している多くの機能を自分で実装する必要あり - 外部ライブラリを使う (候補: pandastable) - テーブル・ウィジェットのある他のGUIライブラリを検討する (候補: wx, qt)
guest

0

ありがとうございます。思い通りの動きができるようになりましたm(_ _)m

投稿2022/10/25 04:53

shinobuKouno

総合スコア31

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問