teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

typo 修正 tow -> row

2020/05/07 10:21

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -155,7 +155,7 @@
155
155
  view.separator.grid(row=row, column=col(), sticky=tk.NSEW, **kw)
156
156
 
157
157
  @addrow
158
- def tow_message(row, col, **kw):
158
+ def row_message(row, col, **kw):
159
159
  view.message.grid(row=row, column=col(), columnspan=maxcolumn, sticky=tk.NSEW, **kw)
160
160
  parent.grid_rowconfigure(row, weight=True)
161
161
 

5

init_view_layout関数: columnの値を動的に生成。グリッド内のマジックナンバー排除

2020/05/07 10:21

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -118,53 +118,56 @@
118
118
  # 後でまとめて、順番に行番号 `row` を与えて呼び出します。
119
119
 
120
120
  # これにより、行の入れ替えや追加が容易に管理できるようになります。
121
- # 但し、列の追加には弱いです。
122
121
 
122
+ from itertools import count
123
+ from functools import partial
124
+
123
125
  rows = []
124
126
  addrow = rows.append
125
127
  maxcolumn = 6
128
+ right = lambda column: maxcolumn-column-1
126
129
  nopad = {"padx":0, "pady": 0}
127
130
 
128
131
  def _finish_layout():
129
132
  for row, func in enumerate(rows):
130
- func(row)
133
+ func(row, partial(next, count()), **nopad)
131
134
 
132
135
  parent = view.parent
133
136
  parent.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
134
137
  parent.grid_columnconfigure(2, weight=True)
135
138
 
136
139
  @addrow
137
- def row_header(row):
140
+ def row_header(row, col, **kw):
138
- view.labelA.grid(row=row, column=0, **nopad)
141
+ view.labelA.grid(row=row, column=col(), **kw)
139
- view.labelB.grid(row=row, column=1, **nopad)
142
+ view.labelB.grid(row=row, column=col(), **kw)
140
143
 
141
144
  @addrow
142
- def row_scrolledtext(row):
145
+ def row_scrolledtext(row, col, **kw):
143
- view.text.grid(row=row, column=0, columnspan=maxcolumn, sticky=tk.NSEW, **nopad)
146
+ view.text.grid(row=row, column=col(), columnspan=maxcolumn, sticky=tk.NSEW, **kw)
144
147
  parent.grid_rowconfigure(row, weight=True)
145
148
 
146
149
  @addrow
147
- def row_center_button(row):
150
+ def row_center_button(row, col, **kw):
148
- view.buttonA.grid(row=row, column=0, columnspan=maxcolumn)
151
+ view.buttonA.grid(row=row, column=col(), columnspan=maxcolumn)
149
152
 
150
153
  @addrow
151
- def row_blank_separator(row):
154
+ def row_blank_separator(row, col, **kw):
152
- view.separator.grid(row=row, column=0, sticky=tk.NSEW, **nopad)
155
+ view.separator.grid(row=row, column=col(), sticky=tk.NSEW, **kw)
153
156
 
154
157
  @addrow
155
- def row_message(row):
158
+ def tow_message(row, col, **kw):
156
- view.message.grid(row=row, column=0, columnspan=maxcolumn, sticky=tk.NSEW, **nopad)
159
+ view.message.grid(row=row, column=col(), columnspan=maxcolumn, sticky=tk.NSEW, **kw)
157
160
  parent.grid_rowconfigure(row, weight=True)
158
161
 
159
162
  @addrow
160
- def row_bottom_label(row):
163
+ def row_bottom_label(row, col, **kw):
161
- view.buttonB.grid(row=row, column=0, sticky=tk.NSEW, **nopad)
164
+ view.buttonB.grid(row=row, column=col(), sticky=tk.NSEW, **kw)
162
- view.labelC.grid(row=row, sticky=tk.NSEW, column=1, **nopad)
165
+ view.labelC.grid(row=row, column=col(), sticky=tk.NSEW, **kw)
163
166
 
164
167
  @addrow
165
- def row_footer(row):
168
+ def row_footer(row, col, **kw):
169
+ view.buttonD.grid(row=row, column=right(col()), sticky=tk.NSEW, **kw)
166
- view.buttonC.grid(row=row, column=maxcolumn-2, sticky=tk.NSEW, **nopad)
170
+ view.buttonC.grid(row=row, column=right(col()), sticky=tk.NSEW, **kw)
167
- view.buttonD.grid(row=row, column=maxcolumn-1, sticky=tk.NSEW, **nopad)
168
171
 
169
172
  _finish_layout()
170
173
 

4

コードの実行に支障はありませんが、gridでcolumn=0 明示してなかったのを2か所訂正

2020/05/07 10:19

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -145,11 +145,11 @@
145
145
 
146
146
  @addrow
147
147
  def row_center_button(row):
148
- view.buttonA.grid(row=row, columnspan=maxcolumn)
148
+ view.buttonA.grid(row=row, column=0, columnspan=maxcolumn)
149
149
 
150
150
  @addrow
151
151
  def row_blank_separator(row):
152
- view.separator.grid(row=row, sticky=tk.NSEW, **nopad)
152
+ view.separator.grid(row=row, column=0, sticky=tk.NSEW, **nopad)
153
153
 
154
154
  @addrow
155
155
  def row_message(row):

3

packでの例を追記

2020/05/07 10:04

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -185,4 +185,49 @@
185
185
 
186
186
  `init_view_style(view)` の行をコメントアウトすると、スタイル適応なしで実行されます。
187
187
 
188
- ![イメージ説明](6bc65ea3cb9918edbe6e5b14cf1b573b.png)
188
+ ![イメージ説明](6bc65ea3cb9918edbe6e5b14cf1b573b.png)
189
+
190
+ ----
191
+ 追記: packでの実装例
192
+
193
+ 最小限のコードになりますが、簡単な方法では、
194
+ 「横に並べる」部分だけを別フレームに切り出し、
195
+ `side="left"` を指定して横並びにします。
196
+
197
+ ```python
198
+ import tkinter as tk
199
+ from tkinter import ttk
200
+ from tkinter.scrolledtext import ScrolledText
201
+
202
+
203
+ def main():
204
+ root = tk.Tk()
205
+
206
+ frameA = ttk.Frame(root)
207
+ frameA.pack(fill=tk.BOTH)
208
+ ttk.Label(frameA, text="Label", width=10).pack(side=tk.LEFT)
209
+ ttk.Label(frameA, text="ListBox?", width=10).pack(side=tk.LEFT)
210
+
211
+ text = ScrolledText(root, height=10)
212
+ text.pack(fill=tk.BOTH, expand=1)
213
+ text.insert(tk.END, "ScrolledText")
214
+
215
+ ttk.Button(root, text="Button").pack()
216
+ ttk.Label(root).pack()
217
+ tk.Message(root, text="Message", width=200, bg="black", fg="white").pack(fill=tk.BOTH, expand=1)
218
+
219
+ frameB = ttk.Frame(root)
220
+ frameB.pack(fill=tk.BOTH)
221
+ ttk.Button(frameB, text="Button", width=10).pack(side=tk.LEFT)
222
+ ttk.Label(frameB, text="Label", width=10).pack(side=tk.LEFT)
223
+
224
+ ttk.Button(root, text="Quit", command=root.destroy).pack(side=tk.RIGHT)
225
+ ttk.Button(root, text="Button").pack(side=tk.RIGHT)
226
+
227
+ root.mainloop()
228
+
229
+
230
+ if __name__ == '__main__':
231
+ main()
232
+
233
+ ```

2

typo修正。実行に影響はなし。

2020/05/07 08:21

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -152,7 +152,7 @@
152
152
  view.separator.grid(row=row, sticky=tk.NSEW, **nopad)
153
153
 
154
154
  @addrow
155
- def tow_message(row):
155
+ def row_message(row):
156
156
  view.message.grid(row=row, column=0, columnspan=maxcolumn, sticky=tk.NSEW, **nopad)
157
157
  parent.grid_rowconfigure(row, weight=True)
158
158
 

1

内部関数の関数名修正。create ではなかった。

2020/05/07 08:13

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -134,35 +134,35 @@
134
134
  parent.grid_columnconfigure(2, weight=True)
135
135
 
136
136
  @addrow
137
- def create_header(row):
137
+ def row_header(row):
138
138
  view.labelA.grid(row=row, column=0, **nopad)
139
139
  view.labelB.grid(row=row, column=1, **nopad)
140
140
 
141
141
  @addrow
142
- def scrolledtext_layout(row):
142
+ def row_scrolledtext(row):
143
143
  view.text.grid(row=row, column=0, columnspan=maxcolumn, sticky=tk.NSEW, **nopad)
144
144
  parent.grid_rowconfigure(row, weight=True)
145
145
 
146
146
  @addrow
147
- def create_center_button(row):
147
+ def row_center_button(row):
148
148
  view.buttonA.grid(row=row, columnspan=maxcolumn)
149
149
 
150
150
  @addrow
151
- def create_blank_separator(row):
151
+ def row_blank_separator(row):
152
152
  view.separator.grid(row=row, sticky=tk.NSEW, **nopad)
153
153
 
154
154
  @addrow
155
- def create_message(row):
155
+ def tow_message(row):
156
156
  view.message.grid(row=row, column=0, columnspan=maxcolumn, sticky=tk.NSEW, **nopad)
157
157
  parent.grid_rowconfigure(row, weight=True)
158
158
 
159
159
  @addrow
160
- def create_bottom_label(row):
160
+ def row_bottom_label(row):
161
161
  view.buttonB.grid(row=row, column=0, sticky=tk.NSEW, **nopad)
162
162
  view.labelC.grid(row=row, sticky=tk.NSEW, column=1, **nopad)
163
163
 
164
164
  @addrow
165
- def create_footer(row):
165
+ def row_footer(row):
166
166
  view.buttonC.grid(row=row, column=maxcolumn-2, sticky=tk.NSEW, **nopad)
167
167
  view.buttonD.grid(row=row, column=maxcolumn-1, sticky=tk.NSEW, **nopad)
168
168