前提
tkinterでUIの練習をしている初心者です。
書籍のデータを入力する簡単なUI画面を作ろうとしている途中、tk.TEXTのみ
配置が上手くいかず試行錯誤中です。
実現したいこと
画面
発生している問題・エラーメッセージ
left_frameでフレーム内を7等分しているのと同じ比率で、right_frameも7等分し、1:6でnote_labelとnote_area(テキストフィールド)を設置したいのですが、
うまく分割されず、テキストフィールドが7つ分を占有して、note_labelが上部に追い出されてしまいます。
該当のソースコード
Python
1 import tkinter as tk 2 from tkinter import ttk 3 4 window = tk.Tk() 5 window.geometry('400x400') 6 window.title('data window') 7 8 #上下フレーム 9 up_frame = tk.Frame(window, width=400, height=350) 10 under_frame = tk.Frame(window, width=400, height=50) 11 12 #上フレームを左右フレームに分ける 13 left_frame = tk.Frame(up_frame, width=200, height=300) 14 right_frame = tk.Frame(up_frame, width=200, height=300) 15 16 up_frame.grid_propagate(False) 17 under_frame.grid_propagate(False) 18 left_frame.grid_propagate(False) 19 right_frame.grid_propagate(False) 20 21 #up_frameのconfigure 22 up_frame.columnconfigure(0,weight=1) 23 up_frame.columnconfigure(1,weight=1) 24 25 #left_frameのconfigure 26 left_frame.columnconfigure(0,weight=1) 27 left_frame.columnconfigure(1,weight=1) 28 left_frame.rowconfigure(0,weight=1) 29 left_frame.rowconfigure(1,weight=1) 30 left_frame.rowconfigure(2,weight=1) 31 left_frame.rowconfigure(3,weight=1) 32 left_frame.rowconfigure(4,weight=1) 33 left_frame.rowconfigure(5,weight=1) 34 left_frame.rowconfigure(6,weight=1) 35 36 #right_frameのconfigure 37 right_frame.columnconfigure(0, weight=1) 38 right_frame.rowconfigure(0, weight=1) 39 right_frame.rowconfigure(1, weight=1) 40 right_frame.rowconfigure(2, weight=1) 41 right_frame.rowconfigure(3, weight=1) 42 right_frame.rowconfigure(4, weight=1) 43 right_frame.rowconfigure(5, weight=1) 44 right_frame.rowconfigure(6, weight=1) 45 46 #under_frameのconfigue 47 under_frame.columnconfigure(0, weight=1) 48 under_frame.columnconfigure(1, weight=1) 49 under_frame.columnconfigure(2, weight=1) 50 51 """left_frame""" 52 #各ラベル 53 number_label = tk.Label(left_frame, text='書誌番号') 54 title_label = tk.Label(left_frame, text='タイトル') 55 author_label = tk.Label(left_frame, text='著者') 56 time_label = tk.Label(left_frame, text='出版年') 57 publisher_label = tk.Label(left_frame, text='出版社') 58 type_label = tk.Label(left_frame, text='形態') 59 janle_label = tk.Label(left_frame, text='ジャンル') 60 61 labels = [number_label, title_label, author_label, time_label, publisher_label, type_label, janle_label] 62 for i, label in enumerate(labels): 63 label.grid(row=i, column=0) 64 65 #各entry 66 number_entry = tk.Entry(left_frame) 67 title_entry = tk.Entry(left_frame) 68 author_entry = tk.Entry(left_frame) 69 time_entry = tk.Entry(left_frame) 70 publisher_entry = tk.Entry(left_frame) 71 72 entrys = [number_entry, title_entry, author_entry, time_entry, publisher_entry] 73 for i, entry in enumerate(entrys): 74 entry.grid(row=i, column=1) 75 76 #combobox 77 type_list = ['1', '2', '3'] 78 type_choice_combo = ttk.Combobox(left_frame, state='readonly', values=type_list) 79 type_choice_combo.current(0) 80 81 #entry 82 janle_entry = tk.Entry(left_frame) 83 84 #combo, entry設置 85 type_choice_combo.grid(column=1, row=5) 86 janle_entry.grid(column=1, row=6) 87 88 89 """right_frame""" 90 #上右側:テキストフィールド UI生成・設置・データ反映 91 note_label = tk.Label(right_frame, text='note') 92 note_label.grid(row=0, column=0) 93 94 note_area = tk.Text(right_frame) 95 note_area.grid(row=1, column=0, rowspan=6) 96 97 98 #under_frame 99 renew_bt = tk.Button(under_frame, text='データ更新', command=None) 100 delete_bt = tk.Button(under_frame, text='データ削除', command=None) 101 new_save_bt = tk.Button(under_frame, text='新規作成', command=None) 102 103 renew_bt.grid(row=0, column=0) 104 delete_bt.grid(row=0, column=1) 105 new_save_bt.grid(row=0, column=2) 106 107 #フレーム設置 108 left_frame.grid(row=0, column=0) 109 right_frame.grid(row=0, column=1) 110 up_frame.grid(row=0, column=0) 111 under_frame.grid(row=1, column=0) 112 113 window.mainloop()
試したこと
記述の順番の入れ替えや、configureでの設定比率の調整を試みましたが、改善されませんでした。
base_parts.py も提示してくれないと動作確認できません。
ついでに、、、変数名や関数名に大文字を使うのはやめましょう。
"tk", "ttk", "db", "p_window" が未定義、
left_frame, right_frame が未配置等 base_parts.py があったとしても、
実行してるファイルと掲載されてるスクリプトが異なってます。
まずは、質問用に問題を単純化したコードを作成し、
単体で実行可能な形で掲載してください。
(レイアウトの問題では db は不要なので、適当な仮データに置き換える等。
質問は7等分ですが、3等分4等分で同じ問題が発生するかを試してください、
質問する際のコードの分量も減るはずです)
投稿のための単純化が中途半端になっていました。申し訳ありません。先ほど細かい不備を修正いたしました。(大文字の部分はモジュールの方でclassを使っておりました)
当初の問題以外の不備が発生しないコードに直しましたので、教えていただいた確認方法や
コードをこれから試す予定です。
teamiklさんにご指摘頂いた、rowを減らしてのトライと、左右フレームの廃止ですが、不備を直したコードで実験してみた結果、どちらもnote_labelとnote_areaが画面いっぱいに表示され、ほかのウィジェットが表示されない結果となりました。(under_frameのみ正確に表示されます)
renew_bt.grid(row=0, column=0)
left_frame.grid(row=0, column=0)
up_frame.grid(row=0, column=0)
衝突してませんか?
それぞれのウィジェットの設置先は
renew_bt→under_frame
left_frame→up_frame
up_frame→window
で別にしているのですが、
指摘して頂いた通り、記述上は同じrow,columnなので何かの原因になっていたりするかもしれません…
記述の順番など色々試してみようと思います。
なるほど。それなら問題ないように思えますね。
> 左右フレームの廃止ですが、不備を直したコードで実験してみた結果、どちらもnote_labelとnote_areaが画面いっぱいに表示され、ほかのウィジェットが表示されない結果となりました。
ここはコードを提示してもらわないと解りません。
現状のコードの問題点はレイアウト管理が別々のフレームに別れている事なので、
gridで等分配置したい場合は、同一のフレームに配置するのは必須です。
ウィンドウのリサイズを考慮しないなら代案は幾つか有りますが、
例えば note_label の grid の引数に pady=15 等を追加して、
縦幅を増やして調整するなどは如何でしょう。
ありがとうございます。言葉が足りずに申し訳ありません。細かい修正を終えた上記のコードから更に左右フレームの設定だけを無くして実行してみたのですが、note_areaだけが表示される状態が続いております。
padyなどの細かい調整も試してみます。
ここは実際のコードを元に話した方が良さそうですね。
回答にサンプルコードを追加しました。
表示されない問題については、レイアウト設定に誤りがあるとしか言えないので、
質問文を編集し、実際に試したコードを提示してください。
left_frame とright_frame の height を up_frame と同じ 350 にしてみてはいかが?
grid の自動計算に頼らずに、自前で 固定長でレイアウトを組むことになりますね。
ウィンドウのリサイズ対応が不要なら、それでもいいかもしれません。
一応、使えそうな設定項目としては、
rowconfigure の minsize=50 で行の最小サイズの設定が出来ます。
回答2件
あなたの回答
tips
プレビュー
