Test Failed
Push — master ( 0ab505...25648c )
by Yoshihiro
03:11
created

SubfunctionProcessingClass.update_character_chart()   A

Complexity

Conditions 2

Size

Total Lines 43
Code Lines 29

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 29
dl 0
loc 43
rs 9.184
c 0
b 0
f 0
cc 2
nop 2
1
#!/usr/bin/env python3
2
import os
3
import shutil
4
import tkinter as tk
5
import tkinter.filedialog as filedialog
6
import matplotlib.pyplot as plt
7
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
8
from pycirclize import Circos
9
import pandas as pd
10
11
from PIL import Image, ImageTk
12
13
from . import FileMenu
14
from . import ListMenuClass
15
from . import Definition
16
17
18
class SubfunctionProcessingClass(Definition.DefinitionClass):
19
    """補助機能のクラス.
20
21
    ・補助機能があるプログラム群
22
23
    Args:
24
        app (instance): MainProcessingClass のインスタンス
25
        locale_var (str): ロケーション
26
        master (instance): toplevel のインスタンス
27
    """
28
29
    def __init__(self, app, locale_var, master=None):
30
        super().__init__(locale_var, master)
31
        self.zoom = 0
32
        self.app = app
33
34
    def mouse_y_scroll(self, event=None):
35
        """マウスホイール移動の設定.
36
37
        ・イメージキャンバスでマウスホイールを回したときにイメージキャンバス
38
        をスクロールする。
39
40
        Args:
41
            event (instance): tkinter.Event のインスタンス
42
        """
43
        if event.delta > 0:
44
            self.app.CanvasImage.yview_scroll(-1, "units")
45
        elif event.delta < 0:
46
            self.app.CanvasImage.yview_scroll(1, "units")
47
48
    def mouse_image_scroll(self, event=None):
49
        """Ctrl+マウスホイールの拡大縮小設定.
50
51
        ・イメージキャンバスでCtrl+マウスホイールを回したときに画像を
52
        拡大縮小する。
53
54
        Args:
55
            event (instance): tkinter.Event のインスタンス
56
        """
57
        title = "./data/image/{0}.txt".format(
58
            ListMenuClass.ListMenuClass.select_list_item
59
        )
60
        with open(title, encoding="utf-8") as f:
61
            zoom = f.read()
62
63
        self.zoom = int(zoom)
64
        f.close()
65
        if event.delta > 0:
66
            self.zoom -= 5
67
            if self.zoom < 10:
68
                self.zoom = 10
69
        elif event.delta < 0:
70
            self.zoom += 5
71
72
        with open(title, mode="w", encoding="utf-8") as f:
73
            f.write(str(self.zoom))
74
75
        self.app.lmc.path_read_image(
76
            "data/image", ListMenuClass.ListMenuClass.select_list_item, self.zoom
77
        )
78
79
    def btn_click(self, event=None):
80
        """似顔絵ボタンを押したとき.
81
82
        ・似顔絵ボタンを押したときに画像イメージを似顔絵フレームに
83
        貼り付ける。
84
85
        Args:
86
            event (instance): tkinter.Event のインスタンス
87
        """
88
        fTyp = [(self.app.dic.get_dict("gif image"), ".gif")]
89
        iDir = os.path.abspath(os.path.dirname(__file__))
90
        self.app.filepath = filedialog.askopenfilename(filetypes=fTyp, initialdir=iDir)
91
        if not self.app.filepath == "":
92
            path, ___ = os.path.splitext(
93
                os.path.basename(FileMenu.FileMenuClass.now_path)
94
            )
95
            ____, ext = os.path.splitext(os.path.basename(self.app.filepath))
96
            title = shutil.copyfile(
97
                self.app.filepath, "./data/character/{0}{1}".format(path, ext)
98
            )
99
            self.print_gif(title)
100
101
    def clear_btn_click(self, event=None):
102
        """消去ボタンをクリックしたとき.
103
104
        ・消去ボタンをクリックしたときに画像イメージから画像を
105
        削除する。
106
107
        Args:
108
            event (instance): tkinter.Event のインスタンス
109
        """
110
        files = "./data/character/{0}.gif".format(
111
            ListMenuClass.ListMenuClass.select_list_item
112
        )
113
        if os.path.isfile(files):
114
            os.remove(files)
115
            self.app.CanvasPortrait.delete("all")
116
117
    @staticmethod
118
    def resize_gif(im):
119
        """画像をリサイズ.
120
121
        ・イメージファイルを縦が長いときは縦を、横が長いときは横を、
122
        同じときは両方を150pxに設定する。
123
124
        Args:
125
            im (instance): イメージインスタンス
126
127
        Returns:
128
            instance: イメージインスタンス
129
        """
130
        resized_image = ""
131
        if im.size[0] == im.size[1]:
132
            resized_image = im.resize((150, 150))
133
        elif im.size[0] > im.size[1]:
134
            zoom = int(im.size[1] * 150 / im.size[0])
135
            resized_image = im.resize((150, zoom))
136
        elif im.size[0] < im.size[1]:
137
            zoom = int(im.size[0] * 200 / im.size[1])
138
            resized_image = im.resize((zoom, 200))
139
        return resized_image
140
141
    def print_gif(self, title):
142
        """gifを表示.
143
144
        ・似顔絵キャンバスに画像を張り付ける。
145
146
        Args:
147
            title (str): タイトル
148
        """
149
150
        if not title == "":
151
            giffile = Image.open(title)
152
            self.app.CanvasPortrait.photo = ImageTk.PhotoImage(self.resize_gif(giffile))
153
            giffile.close()
154
            self.app.CanvasPortrait.itemconfig(
155
                self.app.ImageOnPortrait, image=self.app.CanvasPortrait.photo
156
            )
157
158
    def change_setting(self, event=None):
159
        """テキストの変更時.
160
161
        ・テキストを変更したときに行番号とハイライトを変更する。
162
163
        Args:
164
            event (instance): tkinter.Event のインスタンス
165
        """
166
        self.update_line_numbers()
167
        # その行のハイライトを行う
168
        self.app.hpc.line_highlight()
169
170
    def update_line_numbers(self, event=None):
171
        """行番号の描画.
172
173
        ・行番号をつけて表示する。
174
175
        Args:
176
            event (instance): tkinter.Event のインスタンス
177
        """
178
        # 現在の行番号を全て消す
179
        self.app.CanvasLineNumbers.delete(tk.ALL)
180
181
        # Textの0, 0座標、つまり一番左上が何行目にあたるかを取得
182
        i = self.app.NovelEditor.index("@0,0")
183
        while True:
184
            # dlineinfoは、その行がどの位置にあり、どんなサイズか、を返す
185
            # (3, 705, 197, 13, 18) のように帰る(x,y,width,height,baseline)
186
            dline = self.app.NovelEditor.dlineinfo(i)
187
            # dlineinfoに、存在しない行や、スクロールしないと見えない行を渡すとNoneが帰る
188
            if dline is None:
189
                break
190
            else:
191
                y = dline[1]  # y座標を取得
192
193
            # (x座標, y座標, 方向, 表示テキスト)を渡して行番号のテキストを作成
194
            linenum = str(i).split(".")[0]
195
            self.app.CanvasLineNumbers.create_text(
196
                3, y, anchor=tk.NW, text=linenum, font=("", 12)
197
            )
198
            i = self.app.NovelEditor.index("%s+1line" % i)
199
200
    def update_character_chart(self, event=None):
201
        """キャラクター画面のレーダーチャートを再描画.
202
203
        ・スライダーバーから値をとって再描画する。
204
205
        Args:
206
            event (instance): tkinter.Event のインスタンス
207
        """
208
        # print(self.app.SliderExtraversion.get())
209
        df = pd.DataFrame(
210
            data=[
211
                [
212
                    self.app.SliderExtraversion.get(),
213
                    self.app.SliderAgreeableness.get(),
214
                    self.app.SliderConscientiousness.get(),
215
                    self.app.SliderNeuroticism.get(),
216
                    self.app.SliderOpenness.get(),
217
                ]
218
            ],
219
            index=["Hero"],
220
            columns=[
221
                self.app.dic.get_dict("Extraversion"),
222
                self.app.dic.get_dict("Agreeableness"),
223
                self.app.dic.get_dict("Conscientiousness"),
224
                self.app.dic.get_dict("Neuroticism"),
225
                self.app.dic.get_dict("Openness"),
226
            ],
227
        )
228
        circos = Circos.radar_chart(
229
            df,
230
            vmax=6,
231
            grid_interval_ratio=0.166666666666666,
232
            grid_label_kws=dict(size=20),
233
            label_kws_handler=lambda v: dict(size=20),
234
        )
235
        fig = circos.plotfig(dpi=50)
236
        plt.close()
237
        self.app.canvasCharacterChart.get_tk_widget().pack_forget()
238
        self.app.canvasCharacterChart = FigureCanvasTkAgg(
239
            fig, master=self.app.FrameCharacterChartMap
240
        )
241
        self.app.canvasCharacterChart.draw()
242
        self.app.canvasCharacterChart.get_tk_widget().pack()
243