ちゃんと座標形式で画面設計を前もって行い
それにもとづいてWidget配置(GRID)を行っているのですが 毎回毎回自分が意図したようにならず 本当に困っています。
質問
なぜ意図した表示が行われないのか、どこを変更すれば 設計のように表示されるか? ご教示頂けますでしょうか?
TkInterで画面を作る都度、プログラム以前自分に何かの能力が欠落しているんじゃないかと 悩まされます。
1021 1016 提示コードを全体に差替え、下段に実行時のメニュー画像を追加
Python
1# tkinterのインポート 2import tkinter as tk 3import tkinter.ttk as ttk 4import math 5import os 6from tkinter import filedialog 7import tkinter.messagebox as tkmb 8import openpyxl 9################################################################################# 10# # 11# 一般関数 # 12# # 13# # 14################################################################################# 15# フレーム切替え=画面遷移 16def change_frame(frame): 17 frame.tkraise() 18 19 20################################################################################# 21# # 22# 画面生成 # 23# # 24# # 25################################################################################# 26def resource_path(relative_path): 27 try: 28 # PyInstaller creates a temp folder and stores path in _MEIPASS 29 base_path = sys._MEIPASS 30 except Exception: 31 base_path = os.path.abspath(".") 32 33 return os.path.join(base_path, relative_path) 34 35 36def adjust_windowsize(root): 37 ww = root.winfo_screenwidth() 38 wh = root.winfo_screenheight() 39 40 lw = math.ceil(ww * 0.208) 41 lh = math.ceil(wh * 0.277) 42 43 root.geometry(str(lw)+"x"+str(lh)+"+"+str(int(ww/2-lw/2))+"+"+str(int(wh/2-lh/2))) 44################################################################################# 45# # 46# フレーム生成 # 47# # 48# # 49################################################################################# 50def generate_frame(root): 51 ############################################################################# 52 # # 53 # メインメニュー用フレーム設置 # 54 # # 55 ############################################################################# 56 frmMain = ttk.Frame(root) 57 frmMain.grid(row=0, column=0, sticky=tk.E + tk.W + tk.N + tk.S) 58 59 # メインメニューにボタン配置 60 btn_SettingMenu = tk.Button(frmMain, text = "入出力定義", font=("",0,"normal","roman","normal"), command=lambda: change_frame(frmIOMenu)) 61 btn_SettingMenu.pack(fill = tk.BOTH, expand=True) 62 63 btn_SettingMenu = tk.Button(frmMain, text = "変換定義", font=("",0,"normal","roman","normal")) 64 btn_SettingMenu.pack(fill = tk.BOTH, expand=True) 65 66 btn_RunMenu = tk.Button(frmMain, text = "実行メニュー", font=("",0,"normal","roman","normal")) 67 btn_RunMenu.pack(fill = tk.BOTH, expand=True) 68 btn_RunMenu.focus_set() 69 70 btn_SettingMenu = tk.Button(frmMain, text = "終了", font=("",0,"normal","roman","normal"), command=root.destroy) 71 btn_SettingMenu.pack(fill = tk.BOTH, expand=True) 72 ############################################################################# 73 # # 74 # 入出力定義メニュー用フレーム設置 # 75 # # 76 ############################################################################# 77 frmIOMenu = ttk.Frame(root) 78 frmIOMenu.grid(row=0, column=0, sticky=tk.E + tk.W + tk.N + tk.S) 79 80 # 0 81 cmbox_RecNo = ttk.Combobox(frmIOMenu, state="readonly", height=3) 82 cmbox_RecNo.grid(row=0, column=0, columnspan=2, sticky=tk.N + tk.S + tk.E + tk.W) 83 84 # 0 85 ent_RecName = tk.Entry(frmIOMenu) 86 ent_RecName.grid(row=0, column=2, columnspan=8, sticky=tk.E + tk.W + tk.N + tk.S) 87 88 # 3 シート構成・列構成ツリー 89 tree1 = ttk.Treeview(frmIOMenu, show="tree", height=4) 90 tree1.grid(row=3, column=0, rowspan=4, columnspan=5, sticky=tk.E + tk.W + tk.N + tk.S) 91 ###hscrollbar = ttk.Scrollbar(frmIOMenu, orient=tk.VERTICAL) 92 ###hscrollbar.grid(row=3, column=5, rowspan=4, sticky=tk.N + tk.S + tk.E) 93 94 # 3 95 btn_AddColumn = tk.Button(frmIOMenu, text = "→") 96 btn_AddColumn.grid(row=3, column=5, sticky=tk.E + tk.W + tk.N) 97 98 # 3 シート構成・列構成ツリー 99 tree2 = ttk.Treeview(frmIOMenu, show="headings", height=4) 100 tree2["columns"] =(1) 101 tree2.grid(row=3, column=6, rowspan=4, columnspan=4, sticky=tk.E + tk.W + tk.N + tk.S) 102 103 # 1 入力ファイル指定ボタン、選択ファイル格納テキストボックス配置 104 ent_InputPath = tk.Entry(frmIOMenu, state="disabled") 105 ent_InputPath.grid(row=1, column=3, columnspan=7, sticky=tk.E + tk.W + tk.N + tk.S) 106 107 btn_AssignInputFile = tk.Button(frmIOMenu, text = "入力ファイル指定") 108 btn_AssignInputFile.grid(row=1, column=0, columnspan=3, sticky=tk.E + tk.W + tk.N + tk.S) 109 110 # 2 出力ファイル指定ボタン、選択ファイル格納テキストボックス配置 111 ent_OutputPath = tk.Entry(frmIOMenu, state="disabled") 112 ent_OutputPath.grid(row=2, column=3, columnspan=7, sticky=tk.E + tk.W + tk.N + tk.S) 113 114 btn_AssignOutputFile = tk.Button(frmIOMenu, text = "出力ファイル指定") 115 btn_AssignOutputFile.grid(row=2, column=0, columnspan=3, sticky=tk.E + tk.W + tk.N + tk.S) 116 117 # 4 118 btn_Up = tk.Button(frmIOMenu, text = "↑") 119 btn_Up.grid(row=4, column=5, sticky=tk.E + tk.W + tk.N) 120 121 # 5 122 btn_Down = tk.Button(frmIOMenu, text = "↓") 123 btn_Down.grid(row=5, column=5, sticky=tk.E + tk.W + tk.N) 124 125 # 6 126 btn_Down = tk.Button(frmIOMenu, text = "←") 127 btn_Down.grid(row=6, column=5, sticky=tk.E + tk.W + tk.N) 128 129 # 7 130 cmbox_Type = ttk.Combobox(frmIOMenu, state="readonly", height=3) 131 cmbox_Type.grid(row=7, column=0, columnspan=4, sticky=tk.N + tk.S + tk.E + tk.W) 132 133 # 7 134 cmbox_ConvNo = ttk.Combobox(frmIOMenu, state="readonly", height=3) 135 cmbox_ConvNo.grid(row=7, column=4, columnspan=2, sticky=tk.N + tk.S + tk.E + tk.W) 136 137 # 7 138 cmbox_Type = ttk.Combobox(frmIOMenu, state="readonly", height=3) 139 cmbox_Type.grid(row=7, column=0, columnspan=4, sticky=tk.N + tk.S + tk.E + tk.W) 140 141 # 7 142 ent_AsName = tk.Entry(frmIOMenu) 143 ent_AsName.grid(row=7, column=6, columnspan=4, sticky=tk.E + tk.W + tk.N + tk.S) 144 145 # 8 146 btn_Define = tk.Button(frmIOMenu, text = "定義") 147 btn_Define.grid(row=8, column=4, columnspan=2, sticky=tk.N + tk.S + tk.E+ tk.W) 148 149 # 8 150 btn_Delete = tk.Button(frmIOMenu, text = "削除") 151 btn_Delete.grid(row=8, column=6, columnspan=2, sticky=tk.N + tk.S + tk.E + tk.W) 152 153 # 8 154 btn_ReturnMenu = tk.Button(frmIOMenu, text = "閉じる", command=lambda: change_frame(frmMain)) 155 btn_ReturnMenu.grid(row=8, column=8, columnspan=2, sticky=tk.E + tk.W + tk.N + tk.S) 156 157 # 起動時メインのフレームを前面に 158 frmMain.tkraise() 159 160 161 162 163if __name__ == "__main__": 164 # ウインドウの作成 165 root = tk.Tk() 166 167 #フォームサイズを実行端末から導き、ド真中に配置表示 168 adjust_windowsize(root) 169 170 #タイトルを指定 171 root.title("TkInterの勉強") 172 173 #フレーム切替え達成の上で とても重要、ルートのグリッド定義 174 root.grid_rowconfigure(0, weight=1) 175 root.grid_columnconfigure(0, weight=1) 176 177 root.grid_rowconfigure(1, weight=1) 178 root.grid_columnconfigure(1, weight=1) 179 180 root.grid_rowconfigure(2, weight=1) 181 root.grid_columnconfigure(2, weight=1) 182 183 root.grid_rowconfigure(3, weight=1) 184 root.grid_columnconfigure(3, weight=1) 185 186 root.grid_rowconfigure(4, weight=1) 187 root.grid_columnconfigure(4, weight=1) 188 189 root.grid_rowconfigure(5, weight=1) 190 root.grid_columnconfigure(5, weight=1) 191 192 root.grid_rowconfigure(6, weight=1) 193 root.grid_columnconfigure(6, weight=1) 194 195 root.grid_rowconfigure(7, weight=1) 196 root.grid_columnconfigure(7, weight=1) 197 198 root.grid_rowconfigure(8, weight=1) 199 root.grid_columnconfigure(8, weight=1) 200 201 root.grid_columnconfigure(9, weight=1) 202 203 #フォームの最大化、×ボタン操作を無効化 204 root.resizable(0,0) 205 root.protocol('WM_DELETE_WINDOW', (lambda: 'pass')()) 206 207 # カーソル変更 208 root["cursor"] = "hand2" 209 210 generate_frame(root) 211 212 root.mainloop()
1021 1540 最終的にこうなり、満足!
python
1frmIOMenu = tk.Frame(root, bg="red") 2 3frmIOMenu.grid_rowconfigure([0, 1, 2, 3, 4, 5, 6, 7, 8], weight=1) 4frmIOMenu.grid_columnconfigure([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], weight=1, minsize=40) 5frmIOMenu.grid(row=0, column=0, sticky=tk.E + tk.W + tk.N + tk.S)
意図しない余白や見切れが発生しているということなので、rootに対してgeometryなどでサイズを指定しているからではと愚推します。
ただ、該当部分がないため判断できません。
質問にはコード全体を掲載していただけると助かります。
よろしくおねがいします。
fj68さん、お時間を頂戴致しまして誠にありがとうございます。
本文に文字数制限があるため、画面遷移用途外の ボタン押下から動作する関数は除去し コード全容を貼り付けさせていただきました。rootの上にフレームを貼り付けておりますが 2種フレームの最上位表示を切替えることで 画面遷移イメージを達成しております
確認を頂けたら幸いです!
編集、ありがとうございます。
adjust_windowsize()関数内の以下について
lw = math.ceil(ww * 0.208)
lh = math.ceil(wh * 0.277)
それぞれ0.208や0.277というマジックナンバーはどのように決められましたか?
それぞれwinfo_width()やwinfo_height()ではダメなのでしょうか?
出先でPCがなく検証できないので、頂いたコードを当方でも後ほど試してみます。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー