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

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

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

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

Python

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

Q&A

解決済

1回答

2501閲覧

【Python】複数行ボタン配置の不具合?【tkinter】

netz-eng

総合スコア105

Tkinter

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

Python

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

0グッド

0クリップ

投稿2020/10/01 05:40

前提・実現したいこと

tkinterでGUIの開発をしています。
9つのボタンを等間隔に配置した行を複数作りたいのですが、なぜか2列目から添付画像のように配置が崩れてしまいます。

エラーメッセージは出ていません。

1行目では成功しているため、2行目から配置が崩れる理由がよく分かりません。
どなたか詳しい方、対処法を教えていただきたいです。よろしくお願いします。

該当のソースコード

python

1import tkinter as tk 2import tkinter.ttk as ttk 3 4root = tk.Tk() 5pad = {"padx" : 5, "pady" : 5} 6we = tk.W + tk.E 7w = tk.W 8 9 10# フレーム配置 11fra0 = tk.Frame(root, cnf=pad, height=10) 12fra0.pack(expand=True, fill="x", padx=10) 13fra0.columnconfigure([1, 3, 5], weight=1) 14fra0.rowconfigure([0, 1, 2], weight=1) 15fra0.pack_propagate(0) 16 17fra = tk.Frame(root, cnf=pad, height=10) 18fra.pack(expand=True, fill="x", padx=10) 19fra.columnconfigure([1, 3, 5], weight=1) 20fra.rowconfigure([0, 1, 2], weight=1) 21fra.pack_propagate(0) 22 23fra_2 = tk.Frame(root, cnf=pad, height=10) 24fra_2.pack(expand=True, fill="x", padx=10) 25fra_2.columnconfigure([1, 3, 5], weight=1) 26fra_2.rowconfigure([0, 1, 2], weight=1) 27fra_2.pack_propagate(0) 28 29fra_3 = tk.Frame(root, cnf=pad, height=10) 30fra_3.pack(expand=True, fill="x", padx=10) 31fra_3.columnconfigure([1, 3, 5], weight=1) 32fra_3.rowconfigure([0, 1, 2], weight=1) 33fra_3.pack_propagate(0) 34 35fra2 = tk.Frame(root, cnf=pad, height=10) 36fra2.pack(expand=True, fill="x", padx=10) 37fra2.columnconfigure([1, 3, 5], weight=1) 38fra2.rowconfigure([0, 1, 2], weight=1) 39fra2.pack_propagete(0) 40 41 42StyCol = [] 43Col = [] 44Com = [] 45Btn = [] 46 47for i in range(18): 48 Col.append("red") 49 StyCol.append("ReColor.TButton") 50 51l = len(Col) 52print("l = " + str(l)) 53 54# ラベル配置 55lbl1 = tk.Label(fra0, text="基本色:") 56lbl1.grid(row=0, column=0) 57 58 59lbl2_void = tk.Label(fra2, text="") 60lbl2_void.grid(row=0, column=0) 61lbl2 = tk.Label(fra2, text="作成した色:") 62lbl2.grid(row=1, column=0) 63 64 65# ボタン配置 66for n in range(l): 67 print(Col[n]) 68 style = ttk.Style() 69 style.theme_use("default") 70 style.configure("%s" % StyCol[n], font=("", "", ""), background="%s" % Col[n], foreground="white", borderwidth=3, relief="groove", bordercolor="gray94") 71 style.map("%s" % StyCol[n], background=[("pressed", "!disabled", "%s" % Col[n]), ("active", "%s" % Col[n])], foreground=[("pressed", "white"), ("active", "white")]) 72 style.layout("%s" % StyCol[n], 73 [('TButton.border', {'sticky': 'nswe', 'border': '1', 'children': [ 74 #('Button.focus', {'sticky': 'nswe', 'children': [ 75 ('Button.padding', {'sticky': 'nswe', 'children': [ 76 ('Button.label', {'sticky': 'nswe'})]}) 77 ]}) 78 #]}) 79 ]) 80 if 0 <= n <= 8: 81 btn = ttk.Button(fra, text="", style="%s" % StyCol[n]) 82 btn.grid(row=0, column=n, cnf=pad, sticky=w, ipadx=7, ipady=7) 83 Btn.append(btn) 84 elif 9 <= n <= 16: 85 btn = ttk.Button(fra_2, text="", style="%s" % StyCol[n]) 86 btn.grid(row=1, column=n-9, cnf=pad, sticky=w, ipadx=7, ipady=7) 87 Btn.append(btn) 88 elif 17 <= n <= 24: 89 btn = ttk.Button(fra_3, text="", style="%s" % StyCol[n]) 90 btn.grid(row=2, column=n-17, cnf=pad, sticky=w, ipadx=7, ipady=7) 91 92 93root.mainloop() 94

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

Windows10
Python 3.8.3
tkinter 8.6.10

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず指折りで数えてみればわかると思いますが、
9≦16は要素が9ではなく8です。

python

1 if 0 <= n <= 8: 2 btn = ttk.Button(fra, text="", style="%s" % StyCol[n]) 3 btn.grid(row=0, column=n, cnf=pad, sticky=w, ipadx=7, ipady=7) 4 Btn.append(btn) 5 elif 9 <= n <= 17: 6 btn = ttk.Button(fra_2, text="", style="%s" % StyCol[n]) 7 btn.grid(row=1, column=n-9, cnf=pad, sticky=w, ipadx=7, ipady=7) 8 Btn.append(btn) 9 elif 18 <= n <= 26: 10 btn = ttk.Button(fra_3, text="", style="%s" % StyCol[n]) 11 btn.grid(row=2, column=n-17, cnf=pad, sticky=w, ipadx=7, ipady=7)

こうすれば各列の要素が9で統一されます。

投稿2020/10/01 06:15

yureighost

総合スコア2183

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

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

netz-eng

2020/10/01 07:37

あっ……ご回答ありがとうございます。 単なる数え間違いとは、お恥ずかしい限りです。 いま気づきましたが、同一フレーム内で行を変えれば済む話でしたね。 お手数をおかけしました! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問