Passed
Push — master ( 3731d5...59a60b )
by Yoshihiro
02:04
created

CW.CreateWindowClass.frame_character()   B

Complexity

Conditions 1

Size

Total Lines 118
Code Lines 93

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 47
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 93
nop 1
dl 0
loc 118
ccs 47
cts 47
cp 1
crap 1
rs 7.229
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
#!/usr/bin/env python3
2 1
import tkinter as tk
3 1
import tkinter.ttk as ttk
4
5
6 1
class CustomText(tk.Text):
7
    """Textのイベントを拡張したウィジェット.
8
9
    ・TCl/TKを使って、textに<<Scroll>>イベントと、<<Change>>イベントを追加する。
10
11
    Args:
12
        master (instance): toplevelインスタンス
13
14
    """
15 1
    def __init__(self, master, **kwargs):
16 1
        super().__init__(master, **kwargs)
17 1
        self.tk.eval('''
18
            proc widget_proxy {widget widget_command args} {
19
                # 引数を使用してtkウィジェットコマンドを呼び出す
20
                set result [uplevel [linsert $args 0 $widget_command]]
21
                # ビューが移動した場合、バインドできるイベントを生成する
22
                if {([lrange $args 0 1] == {xview moveto}) ||
23
                    ([lrange $args 0 1] == {xview scroll}) ||
24
                    ([lrange $args 0 1] == {yview moveto}) ||
25
                    ([lrange $args 0 1] == {yview scroll})} {
26
                    event generate  $widget <<Scroll>> -when tail
27
                }
28
                # 内容が変更された場合、バインドできるイベントを生成する
29
                if {([lindex $args 0] in {insert replace delete})} {
30
                    event generate  $widget <<Change>> -when tail
31
                }
32
                # ウィジェットコマンドから結果を返す
33
                return $result
34
            }
35
            ''')
36 1
        self.tk.eval('''
37
            # コマンドをリネームする
38
            rename {widget} _{widget}
39
            # コマンドを置き換える
40
            interp alias {{}} ::{widget} {{}} widget_proxy {widget} _{widget}
41
        '''.format(widget=str(self)))
42
43
44 1
class CreateWindowClass():
45
    """画面の描画のクラス.
46
47
    ・画面描画にあるプログラム群
48
49
    Args:
50
        app (instance): MainProcessingClassインスタンス
51
52
    """
53 1
    def __init__(self, app):
54 1
        self.APP = app
55 1
        self.BLANK_IMAGE = '''R0lGODlhHgAeAPcAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz
56
            /wBmAABmMwBmZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDM
57
            mQDMzADM/wD/AAD/MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMz
58
            MzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ
59
            /zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmYA
60
            mWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZAGaZ
61
            M2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb/
62
            /5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplm
63
            mZlmzJlm/5mZAJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/
64
            M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswAmcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz
65
            /8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZzMyZ/8zMAMzMM8zMZszM
66
            mczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A//8zAP8z
67
            M/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z
68
            ///MAP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///8DAwICAgIAAAACA
69
            AAAAgICAAIAAgACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
70
            AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
71
            AAAAAAAAAAAAAAAAACwAAAAAHgAeAAAIMgABCBxIsKDBgwgTKlzIsKHDhxAjSpxI
72
            saLFixgzatzIsaPHjyBDihxJsqTJkyhTngwIADs=
73
            '''
74
75 1
    def create_widgets(self):
76
        """画面の描画.
77
78
        ・メインウインドウにウェジットを配置する。
79
80
        """
81
        # メニューの配置
82 1
        File_menu = tk.Menu(self.APP.menu_bar, tearoff=0)
83 1
        Edit_menu = tk.Menu(self.APP.menu_bar, tearoff=0)
84 1
        List_menu = tk.Menu(self.APP.menu_bar, tearoff=0)
85 1
        Processing_menu = tk.Menu(self.APP.menu_bar, tearoff=0)
86 1
        Help_menu = tk.Menu(self.APP.menu_bar, tearoff=0)
87
        # ファイルメニュー
88 1
        File_menu.add_command(
89
            label=u'新規作成(N)',
90
            under=5,
91
            accelerator='Ctrl+N',
92
            command=self.APP.fmc.new_open
93
        )
94 1
        File_menu.add_command(
95
            label=u'開く(O)',
96
            under=3,
97
            accelerator='Ctrl+E',
98
            command=self.APP.fmc.open_file
99
        )
100 1
        File_menu.add_separator()
101 1
        File_menu.add_command(
102
            label=u'保存(S)',
103
            under=3,
104
            accelerator='Ctrl+S',
105
            command=self.APP.fmc.overwrite_save_file
106
        )
107 1
        File_menu.add_command(
108
            label=u'名前を付けて保存(W)',
109
            under=9,
110
            accelerator='Ctrl+W',
111
            command=self.APP.fmc.save_file
112
        )
113 1
        File_menu.add_separator()
114 1
        File_menu.add_command(
115
            label=u'閉じる(C)',
116
            under=4,
117
            accelerator='Ctrl+C',
118
            command=self.APP.fmc.on_closing
119
        )
120 1
        self.APP.menu_bar.add_cascade(
121
            label=u'ファイル(F)',
122
            under=5,
123
            menu=File_menu
124
        )
125
        # 編集メニュー
126 1
        Edit_menu.add_command(
127
            label=u'やり直し(R)',
128
            under=5,
129
            accelerator='Ctrl+Shift+Z',
130
            command=self.APP.emc.redo
131
        )
132 1
        Edit_menu.add_command(
133
            label=u'戻る(U)',
134
            under=3,
135
            accelerator='Ctrl+Z',
136
            command=self.APP.emc.undo
137
        )
138 1
        Edit_menu.add_separator()
139 1
        Edit_menu.add_command(
140
            label=u'切り取り(X)',
141
            under=5,
142
            accelerator='Ctrl+X',
143
            command=self.APP.emc.cut
144
        )
145 1
        Edit_menu.add_command(
146
            label=u'コピー(C)',
147
            under=4,
148
            accelerator='Ctrl+C',
149
            command=self.APP.emc.copy
150
        )
151 1
        Edit_menu.add_command(
152
            label=u'貼り付け(V)',
153
            under=5,
154
            accelerator='Ctrl+V',
155
            command=self.APP.emc.paste
156
        )
157 1
        Edit_menu.add_separator()
158 1
        Edit_menu.add_command(
159
            label=u'検索(F)',
160
            under=3,
161
            accelerator='Ctrl+F',
162
            command=self.APP.fpc.find_dialog
163
        )
164 1
        Edit_menu.add_command(
165
            label=u'置換(L)',
166
            under=3,
167
            accelerator='Ctrl+L',
168
            command=self.APP.fpc.replacement_dialog
169
        )
170 1
        self.APP.menu_bar.add_cascade(
171
            label=u'編集(E)',
172
            under=3,
173
            menu=Edit_menu
174
        )
175
        # 処理メニュー
176 1
        Processing_menu.add_command(
177
            label=u'ルビをふる(R)',
178
            under=6,
179
            accelerator='Ctrl+R',
180
            command=self.APP.pmc.ruby_huri
181
        )
182 1
        Processing_menu.add_command(
183
            label=u'文字数のカウント(C)',
184
            under=9,
185
            accelerator='Ctrl+Shift+C',
186
            command=self.APP.pmc.count_moji
187
        )
188 1
        Processing_menu.add_command(
189
            label=u'選択文字の意味(M)',
190
            under=8,
191
            accelerator='Ctrl+Shift+F',
192
            command=self.APP.pmc.find_wikipedia
193
        )
194 1
        Processing_menu.add_command(
195
            label=u'文章の読み上げ(B)',
196
            under=8,
197
            accelerator='Ctrl+Shift+R',
198
            command=self.APP.pmc.read_text
199
        )
200 1
        Processing_menu.add_command(
201
            label=u'文章校正(Y)',
202
            under=5,
203
            accelerator='Ctrl+Y',
204
            command=self.APP.pmc.yahoo
205
        )
206 1
        Processing_menu.add_separator()
207 1
        Processing_menu.add_command(
208
            label=u'フォントサイズの変更(F)',
209
            under=11,
210
            accelerator='Ctrl+Shift+F',
211
            command=self.APP.pmc.font_dialog
212
        )
213 1
        Processing_menu.add_separator()
214 1
        Processing_menu.add_command(
215
            label=u'「小説家になろう」のページを開く(U)',
216
            under=17,
217
            accelerator='Ctrl+U',
218
            command=self.APP.pmc.open_becoming_novelist_page
219
        )
220 1
        self.APP.menu_bar.add_cascade(
221
            label=u'処理(P)',
222
            under=3,
223
            menu=Processing_menu
224
        )
225
        # リストメニュー
226 1
        List_menu.add_command(
227
            label=u'項目を増やす(U)',
228
            under=7,
229
            accelerator='選択右クリック',
230
            command=self.APP.lmc.message_window
231
        )
232 1
        List_menu.add_command(
233
            label=u'項目を削除(D)',
234
            under=6,
235
            accelerator='選択右クリック',
236
            command=self.APP.lmc.message_window
237
        )
238 1
        List_menu.add_command(
239
            label=u'項目の名前を変更(C)',
240
            under=9,
241
            accelerator='Ctrl+G',
242
            command=self.APP.lmc.on_name_click
243
        )
244 1
        self.APP.menu_bar.add_cascade(
245
            label=u'リスト(L)',
246
            under=4,
247
            menu=List_menu
248
        )
249
        # ヘルプメニュー
250 1
        Help_menu.add_command(
251
            label=u'ヘルプ(H)',
252
            under=4,
253
            accelerator='Ctrl+H',
254
            command=self.APP.hmc.help
255
        )
256 1
        Help_menu.add_command(
257
            label=u'バージョン情報(V)',
258
            under=8,
259
            accelerator='Ctrl+Shift+V',
260
            command=self.APP.hmc.version
261
        )
262 1
        self.APP.menu_bar.add_cascade(
263
            label=u'ヘルプ(H)',
264
            under=4,
265
            menu=Help_menu
266
        )
267
        # ツリーコントロール、入力欄、行番号欄、スクロール部分を作成
268 1
        self.APP.tree = ttk.Treeview(self.APP, show="tree")
269 1
        self.APP.tree.grid(row=0, column=0, sticky=(tk.N, tk.S))
270 1
        self.frame()
271 1
        self.APP.fmc.tree_get_loop()
272
273 1
    def frame(self):
274
        """フレーム内にテキストボックスを表示.
275
276
        ・メインウインドウの右側に行番号、テキストボックス、スクロールバー
277
        を表示する。
278
279
        """
280
        # f1フレームにテキストエディタを表示
281 1
        self.APP.f1 = tk.Frame(self.APP, relief=tk.RIDGE, bd=2)
282 1
        self.APP.text = CustomText(
283
            self.APP.f1,
284
            font=(self.APP.font, self.APP.pmc.font_size),
285
            undo=True
286
        )
287 1
        self.APP.line_numbers = tk.Canvas(self.APP.f1, width=30)
288 1
        self.APP.ysb = ttk.Scrollbar(
289
            self.APP.f1,
290
            orient=tk.VERTICAL,
291
            command=self.APP.text.yview
292
        )
293
        # 入力欄にスクロールを紐付け
294 1
        self.APP.text.configure(yscrollcommand=self.APP.ysb.set)
295
        # 左から行番号、入力欄、スクロールウィジェット
296 1
        self.APP.line_numbers.grid(row=0, column=0, sticky=(tk.N, tk.S))
297 1
        self.APP.text.grid(row=0, column=1, sticky=(tk.N, tk.S, tk.W, tk.E))
298 1
        self.APP.ysb.grid(row=0, column=2, sticky=(tk.N, tk.S))
299 1
        self.APP.f1.columnconfigure(1, weight=1)
300 1
        self.APP.f1.rowconfigure(0, weight=1)
301 1
        self.APP.f1.grid(row=0, column=1, sticky=(tk.N, tk.S, tk.W, tk.E))
302
        # テキスト入力欄のみ拡大されるように
303 1
        self.APP.columnconfigure(1, weight=1)
304 1
        self.APP.rowconfigure(0, weight=1)
305
        # テキストを読み取り専用にする
306 1
        self.APP.text.configure(state='disabled')
307
        # テキストにフォーカスを当てる
308 1
        self.APP.text.focus()
309 1
        self.APP.epc.create_event_text()
310
311 1
    def frame_image(self):
312
        """フレーム内にイメージフレーム表示.
313
314
        ・メインウインドウの右側にイメージキャンバス、スクロールバーを表示する。
315
316
        """
317 1
        self.APP.f1 = tk.Frame(self.APP, relief=tk.RIDGE, bd=2)
318 1
        self.APP.image_space = tk.Canvas(self.APP.f1, bg="black", width=30)
319 1
        self.APP.image_ysb = ttk.Scrollbar(
320
            self.APP.f1,
321
            orient=tk.VERTICAL,
322
            command=self.APP.image_space.yview
323
        )
324 1
        self.APP.image_xsb = ttk.Scrollbar(
325
            self.APP.f1,
326
            orient=tk.HORIZONTAL,
327
            command=self.APP.image_space.xview
328
        )
329 1
        self.APP.image_space.configure(xscrollcommand=self.APP.image_xsb.set)
330 1
        self.APP.image_space.configure(yscrollcommand=self.APP.image_ysb.set)
331 1
        self.APP.image_space.grid(
332
            row=0,
333
            column=1,
334
            sticky=(tk.N, tk.S, tk.W, tk.E)
335
        )
336 1
        self.APP.image_ysb.grid(row=0, column=2, sticky=(tk.N, tk.S))
337 1
        self.APP.image_xsb.grid(row=1, column=1, sticky=(tk.W, tk.E))
338 1
        self.APP.f1.grid(row=0, column=1, sticky=(tk.N, tk.S, tk.W, tk.E))
339 1
        self.APP.f1.columnconfigure(1, weight=1)
340 1
        self.APP.f1.rowconfigure(0, weight=1)
341 1
        self.APP.f1.grid(row=0, column=1, sticky=(tk.N, tk.S, tk.W, tk.E))
342
        # デフォルトの画像を設定する
343 1
        self.APP.image_space.photo = tk.PhotoImage(data=self.BLANK_IMAGE)
344 1
        self.APP.image_on_space = self.APP.image_space.create_image(
345
            0,
346
            0,
347
            anchor='nw',
348
            image=self.APP.image_space.photo
349
        )
350 1
        self.APP.epc.create_event_image()
351
352 1
    def frame_character(self):
353
        """フレーム内にイメージフレーム表示.
354
355
        ・メインウインドウの右側に呼び名、似顔絵、名前、誕生日、略歴を表示する。
356
357
        """
358
        # チェック有無変数
359 1
        self.APP.var = tk.IntVar()
360
        # value=0のラジオボタンにチェックを入れる
361 1
        self.APP.var.set(0)
362 1
        self.APP.f1 = tk.Frame(self.APP, relief=tk.RIDGE, bd=2)
363 1
        self.APP.label1 = tk.Label(self.APP.f1, text=u"呼び名")
364 1
        self.APP.txt_yobi_name = ttk.Entry(
365
            self.APP.f1, width=30,
366
            font=(self.APP.font, self.APP.pmc.font_size)
367
        )
368 1
        self.APP.label2 = tk.Label(self.APP.f1, text=u"名前")
369 1
        self.APP.txt_name = ttk.Entry(
370
            self.APP.f1, width=40,
371
            font=(self.APP.font, self.APP.pmc.font_size)
372
        )
373 1
        self.APP.f2 = tk.LabelFrame(
374
            self.APP.f1,
375
            relief=tk.RIDGE,
376
            bd=2,
377
            text=u"性別"
378
        )
379 1
        self.APP.rdo1 = tk.Radiobutton(
380
            self.APP.f2, value=0,
381
            variable=self.APP.var,
382
            text=u'男'
383
        )
384 1
        self.APP.rdo2 = tk.Radiobutton(
385
            self.APP.f2, value=1,
386
            variable=self.APP.var,
387
            text=u'女'
388
        )
389 1
        self.APP.rdo3 = tk.Radiobutton(
390
            self.APP.f2, value=2,
391
            variable=self.APP.var,
392
            text=u'その他'
393
        )
394 1
        self.APP.rdo1.grid(row=0, column=1)
395 1
        self.APP.rdo2.grid(row=1, column=1)
396 1
        self.APP.rdo3.grid(row=2, column=1)
397 1
        self.APP.f3 = tk.LabelFrame(
398
            self.APP.f1,
399
            relief=tk.RIDGE,
400
            bd=2,
401
            text=u"似顔絵"
402
        )
403 1
        self.APP.cv = self.APP.foto_canvas = tk.Canvas(
404
            self.APP.f3,
405
            bg="black",
406
            width=149,
407
            height=199
408
        )
409 1
        self.APP.foto_canvas.grid(row=0, column=0)
410 1
        self.APP.label3 = tk.Label(self.APP.f1, text=u"誕生日")
411 1
        self.APP.txt_birthday = ttk.Entry(
412
            self.APP.f1, width=40,
413
            font=(self.APP.font, self.APP.pmc.font_size)
414
        )
415 1
        self.APP.f4 = tk.Frame(self.APP.f1)
416 1
        self.APP.foto_button = ttk.Button(
417
            self.APP.f4,
418
            width=5,
419
            text=u'挿入',
420
            command=self.APP.sfc.btn_click
421
        )
422 1
        self.APP.foto_button_calcel = ttk.Button(
423
            self.APP.f4,
424
            width=5,
425
            text=u'消去',
426
            command=self.APP.sfc.clear_btn_click
427
        )
428 1
        self.APP.foto_button.grid(row=0, column=1)
429 1
        self.APP.foto_button_calcel.grid(row=1, column=1)
430 1
        self.APP.label4 = tk.Label(self.APP.f1, text=u"略歴")
431 1
        self.APP.text_body = tk.Text(
432
            self.APP.f1,
433
            width=80,
434
            font=(self.APP.font, self.APP.pmc.font_size)
435
        )
436 1
        self.APP.label1.grid(row=0, column=1, columnspa=2)
437 1
        self.APP.txt_yobi_name.grid(row=1, column=1, columnspa=2)
438 1
        self.APP.f2.grid(row=2, column=1, rowspan=2)
439 1
        self.APP.f4.grid(row=3, column=2)
440 1
        self.APP.f3.grid(row=0, column=3, rowspan=4)
441 1
        self.APP.label2.grid(row=0, column=4, sticky=(tk.N, tk.S, tk.W, tk.E))
442 1
        self.APP.txt_name.grid(row=1, column=4)
443 1
        self.APP.label3.grid(row=2, column=4)
444 1
        self.APP.txt_birthday.grid(row=3, column=4)
445 1
        self.APP.label4.grid(row=4, column=1, columnspa=4)
446 1
        self.APP.text_body.grid(
447
            row=5,
448
            column=1,
449
            columnspa=4,
450
            sticky=(tk.N, tk.S, tk.W, tk.E)
451
        )
452 1
        self.APP.f1.columnconfigure(1, weight=1)
453 1
        self.APP.f1.columnconfigure(4, weight=1)
454 1
        self.APP.f1.rowconfigure(5, weight=1)
455
456 1
        self.APP.f1.grid(row=0, column=1, sticky=(tk.N, tk.S, tk.W, tk.E))
457 1
        self.APP.columnconfigure(1, weight=1)
458 1
        self.APP.rowconfigure(0, weight=1)
459
        # デフォルトの画像を設定する
460 1
        self.APP.cv.photo = tk.PhotoImage(data=self.BLANK_IMAGE)
461 1
        self.APP.image_on_canvas = self.APP.cv.create_image(
462
            0,
463
            0,
464
            anchor='nw',
465
            image=self.APP.cv.photo
466
        )
467
468
        # キャラクターイベントを追加
469
        self.APP.epc.create_event_character()
470