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

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

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

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

Python

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

Q&A

解決済

1回答

2868閲覧

Python(TkInter) ダイアログのデザインが思い通りにならない。列幅が統一された状況下でWidgetをGRIDしたいが Widgetの幅に差が出ている

saya24

総合スコア221

Tkinter

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

Python

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

0グッド

0クリップ

投稿2020/06/10 09:58

標題の件を達成するために、以前こちらのサイトでご教示を頂きました「 ~.grid_propagate(False) 」を試すものの効果を発揮しません。

以下の図をご確認ください
(以下のコードを貼付けて実行後、冗談のSUBというボタンを押下頂ければ下記ダイアログが現れます)
細かいことですが コマンドボタンが一定幅になっていません。
イメージ説明

【質問】
ボタンWidgetの幅を一定にするには どういう策を投じすれば よろしいのでしょうか?
毎回同じような質問をしてしまい 誠に申し訳ございません。

Python

1from tkinter import * 2import tkinter.ttk as ttk 3import tkinter.scrolledtext as tksc 4import math 5 6class Apprication(ttk.Frame): 7 8 def __init__(self, app): 9 super().__init__(app) 10 self.pack(fill=BOTH, expand=True) 11 12 btn1 = ttk.Button(self, text="Sub", command=self.openDialog2) 13 btn1.bind('<Return>', self.openDialog2) 14 btn1.pack(fill=BOTH, expand=True) 15 btn1.focus_set() 16 17 btn2 = ttk.Button(self, text="Quit", command=app.quit) 18 btn2.bind('<Return>', lambda _: app.quit()) 19 btn2.pack(fill=BOTH, expand=True) 20 21 self.menu() 22 23 24 25 def menu(self): 26 menu_top = Menu(app) 27 menu_file = Menu(menu_top, tearoff=False) 28 menu_open = Menu(menu_top, tearoff=False) 29 30 app.configure(menu=menu_top, bg="#F0FFFF") 31 32 menu_top.add_cascade (label='File(F)', menu=menu_file, underline=0) 33 34 menu_file.add_cascade(label='Open(O)', underline=0, menu=menu_open) 35 menu_open.add_command(label='Sub(S)', underline=0, command=self.openDialog2) 36 menu_file.add_command(label='Quit(Q)',underline=0, command=app.quit) 37 38 39 40 41 42 # 子画面開く 43 def openDialog2(self, event=None): 44 45 self.dialog = Toplevel(self) 46 self.dialog.title("Job Schedule Menu") 47 48 # フォームサイズを実行端末から導き、ド真中に配置表示 49 lw = math.ceil(ww * 0.408) 50 lh = math.ceil(wh * 0.240) 51 self.dialog.geometry(str(lw)+"x"+str(lh)+"+"+str(int(ww/2-lw/2))+"+"+str(int(wh/2-lh/2))) 52 53 self.dialog.configure(bg="#F0FFFF") 54 self.dialog.resizable(0,0) 55 #self.dialog.protocol('WM_DELETE_WINDOW', (lambda: 'pass')()) 56 57 # gridのcolumnを伸縮可能にする 58 self.dialog.grid_columnconfigure(0, weight=1, minsize=lw/9.2) 59 self.dialog.grid_columnconfigure(1, weight=1, minsize=lw/9.2) 60 self.dialog.grid_columnconfigure(2, weight=1, minsize=lw/9.2) 61 self.dialog.grid_columnconfigure(3, weight=1, minsize=lw/9.2) 62 self.dialog.grid_columnconfigure(4, weight=1, minsize=lw/9.2) 63 self.dialog.grid_columnconfigure(5, weight=1, minsize=lw/9.2) 64 self.dialog.grid_columnconfigure(6, weight=1, minsize=lw/9.2) 65 self.dialog.grid_columnconfigure(7, weight=1, minsize=lw/9.2) 66 self.dialog.grid_columnconfigure(8, weight=1, minsize=lw/9.2) 67 68 self.dialog.grid_propagate(False) 69 70 # modalに 71 self.dialog.grab_set() 72 73 tree1 = ttk.Treeview(self.dialog, height=5) 74 #列を3列作る 75 tree1["column"] = (1,2,3,4,5,6,7,8,9,10,11,12,13,14) 76 tree1["show"] = "headings" 77 #ヘッダーテキスト 78 tree1.heading(1,text="ID") 79 tree1.heading(2,text="VALID") 80 tree1.heading(3,text="DB") 81 tree1.heading(4,text="SCRIPT") 82 tree1.heading(5,text="SUBJECT") 83 tree1.heading(6,text="TIME") 84 tree1.heading(7,text="INTERVAL") 85 tree1.heading(8,text="MON") 86 tree1.heading(9,text="TUE") 87 tree1.heading(10,text="WED") 88 tree1.heading(11,text="THU") 89 tree1.heading(12,text="FRI") 90 tree1.heading(13,text="SAT") 91 tree1.heading(14,text="SUN") 92 93 94 #列の幅 95 tree1.column(1, width=math.ceil(lw * 0.05), anchor=CENTER) #ID 96 tree1.column(2, width=math.ceil(lw * 0.05), anchor=CENTER) #VALID 97 tree1.column(3, width=math.ceil(lw * 0.35)) #DB 98 tree1.column(4, width=math.ceil(lw * 0.35)) #SCRIPT 99 tree1.column(5, width=math.ceil(lw * 0.35)) #TITLE 100 tree1.column(6, width=math.ceil(lw * 0.10), anchor=CENTER) #ON TIME 101 tree1.column(7, width=math.ceil(lw * 0.10), anchor=CENTER) #ON INTERVAL 102 tree1.column(8, width=math.ceil(lw * 0.05), anchor=CENTER) #MON 103 tree1.column(9, width=math.ceil(lw * 0.05), anchor=CENTER) #TUE 104 tree1.column(10, width=math.ceil(lw * 0.05), anchor=CENTER) #WED 105 tree1.column(11, width=math.ceil(lw * 0.05), anchor=CENTER) #THU 106 tree1.column(12, width=math.ceil(lw * 0.05), anchor=CENTER) #FRI 107 tree1.column(13, width=math.ceil(lw * 0.05), anchor=CENTER) #SAT 108 tree1.column(14, width=math.ceil(lw * 0.05), anchor=CENTER) #SUN 109 110 111 #操作にコマンドをバインド 112 #tree1.bind("<<TreeviewSelect>>", line_Select) 113 114 #設置 115 tree1.grid(row=0, column=0, columnspan=9, sticky=N+W+E+S, padx=(10,10), pady=(10,0), rowspan=5) 116 117 118 hscrollbar = ttk.Scrollbar(self.dialog, orient=HORIZONTAL, command=tree1.xview) 119 tree1.configure(xscrollcommand=lambda f, l: hscrollbar.set(f, l)) 120 hscrollbar.grid(row=6, column=0, columnspan=9, sticky=W+E, padx=(10,10)) 121 122 btn1 = Button(self.dialog, text="Inquiry", state="disable") 123 btn1.grid(row=7,column=5, sticky=N+W+E+S, padx=(10,0), pady=(10,0)) 124 btn2 = Button(self.dialog, text="Delete", state="disable") 125 btn2.grid(row=7,column=6, sticky=N+W+E+S, pady=(10,0)) 126 btn3 = Button(self.dialog, text="Enable", state="disable") 127 btn3.grid(row=7,column=7, sticky=N+W+E+S, pady=(10,0)) 128 btn4 = Button(self.dialog, text="Disable", state="disable") 129 btn4.grid(row=7,column=8, sticky=N+W+E+S, padx=(0,10), pady=(10,0)) 130 131 132 133 # 子画面閉じる 134 def closeDialog(self): 135 self.dialog.destroy() 136 137 138 139if __name__ == '__main__': 140 141 #世間でいうrootをappとしています 142 app = Tk() 143 144 #実行端末の画面サイズを取得 145 ww = app.winfo_screenwidth() 146 wh = app.winfo_screenheight() 147 148 app.update_idletasks() 149 150 #フォームサイズを実行端末から導き、ド真中に配置表示 151 lw = math.ceil(ww * 0.208) 152 lh = math.ceil(wh * 0.277) 153 app.geometry(str(lw)+"x"+str(lh)+"+"+str(int(ww/2-lw/2))+"+"+str(int(wh/2-lh/2)) ) 154 155 #タイトルを指定 156 app.title("Main Menu") 157 158 #フォームの最大化、×ボタン操作を無効化 159 app.resizable(0,0) 160 app.protocol('WM_DELETE_WINDOW', (lambda: 'pass')()) 161 162 163 164 menu_top = Menu(app) 165 menu_file = Menu(menu_top, tearoff=False) 166 menu_open = Menu(menu_top, tearoff=False) 167 168 app.configure(menu=menu_top, bg="#F0FFFF") 169 170 menu_top.add_cascade (label='File(F)', menu=menu_file, underline=0) 171 172 menu_file.add_cascade(label='Open(O)', underline=0, menu=menu_open) 173 menu_open.add_command(label='Sub(S)', underline=0, command="app.openDialog2") 174 menu_file.add_command(label='Quit(Q)',underline=0, command=app.quit) 175 176 177 # フレームを作成する 178 frame = Apprication(app) 179 # 格納したTkインスタンスのmainloopで画面を起こす 180 app.mainloop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

btn1とbtn4には端にpadxで10px余白を入れているようですが、それが原因で両端のボタンの幅が狭くなっています。
グリッドの各幅の最小値minsizelw/9.2 = 85くらいになっていますね。padxで設定した余白も含めてグリッドの幅になるので両端のボタンの幅が75pxになっているのです。

余白もグリッドにするか、grid(8)のminsizeだけ余白分+10pxを加えるかすれば良いのではないでしょうか。

投稿2020/06/11 03:32

hope_mucci

総合スコア4447

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

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

saya24

2020/06/12 11:46

ありがとうございました、また返事が遅れてしまい申し訳ございませんでした。 思い出しました、固定値の設定を極力なくす定義が必要で、余白調整にもその認識を適用すべきことを完全に忘れていました。貴重なお時間を頂き ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問