Jelajahi Sumber

feat: 令Matplotlib支持中文

SongZihuan 3 tahun lalu
induk
melakukan
30db001fc2
3 mengubah file dengan 33 tambahan dan 14 penghapusan
  1. 3 1
      conf/__init__.py
  2. 15 0
      conf/matplotlib_conf.py
  3. 15 13
      tk_ui/admin_program.py

+ 3 - 1
conf/__init__.py

@@ -10,12 +10,14 @@ from .equipment import ConfigCapture
 from .sql import ConfigDatabase
 from .aliyun import ConfigAliyun
 from .sys_default import ConfigExport, ConfigSystem, ConfigSecret, ConfigTkinter, ConfUser
+from .matplotlib_conf import ConfigMatplotlib
 
 
 class Config(ConfigTkinter, ConfigSecret, ConfigSystem, ConfUser, ConfigExport,
              ConfigAliyun,
              ConfigDatabase,
-             ConfigCapture):
+             ConfigCapture,
+             ConfigMatplotlib):
     run_type = p_args.run[0]
     program = p_args.program[0]
 

+ 15 - 0
conf/matplotlib_conf.py

@@ -0,0 +1,15 @@
+import matplotlib.font_manager as fm
+
+
+class ConfigMatplotlibRelease:
+    matplotlib_font = "SimHei"
+    matplotlib_font_dict = dict(family=matplotlib_font)
+
+
+ConfigMatplotlib = ConfigMatplotlibRelease
+
+if "SimHei" not in [f.name for f in fm.fontManager.ttflist]:
+    print("请安装SimHei字体")
+    exit(1)
+fm.rcParams["font.sans-serif"] = [ConfigMatplotlib.matplotlib_font]  # 配置中文字体
+fm.rcParams["axes.unicode_minus"] = False  # 解决负号变豆腐块

+ 15 - 13
tk_ui/admin_program.py

@@ -3,8 +3,7 @@ import tkinter as tk
 import tkinter.ttk as ttk
 from tkinter.filedialog import askdirectory, askopenfilename
 
-import matplotlib
-from matplotlib import font_manager
+from matplotlib import font_manager as fm
 from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
 from matplotlib.axes import Axes
 import numpy as np
@@ -1754,7 +1753,6 @@ class StatisticsTimeBaseProgram(AdminProgram):
         self.figure_frame = tk.Frame(self.frame)
         self.figure = Figure(dpi=100)
         self.plt: Axes = self.figure.add_subplot(111)  # 添加子图:1行1列第1个
-        self.font = font_manager.FontProperties(fname=Config.font_d["noto"])
 
         self.canvas = FigureCanvasTkAgg(self.figure, master=self.figure_frame)
         self.canvas_tk = self.canvas.get_tk_widget()
@@ -1952,9 +1950,13 @@ class StatisticsTimeBaseProgram(AdminProgram):
                              label=res_type)
                 bottom += np.array(y)
 
-        if self.legend_show[1].get() == 1:
-            self.plt.legend(loc="upper left", prop=self.font)
+        if self.legend_show[1].get() == 1:  # 显示图例
+            self.plt.legend(loc="upper left")
 
+        self.plt.set_xlim(-1, 24)
+        self.plt.set_xticks([i for i in range(0, 24, 2)])
+        self.plt.set_xticklabels([f"{i}h" for i in range(0, 24, 2)])
+        self.plt.set_title(self.program_title)
         self.canvas.draw()
         self.toolbar.update()
         self.update_listbox()
@@ -1981,10 +1983,10 @@ class StatisticsTimeTypeProgram(StatisticsTimeBaseProgram):
     def __init__(self, station, win, color):
         super().__init__(station, win, color, "时段分析-按投放类型")
         self._conf("#abc88b")
-        self.color_show_dict[GarbageType.GarbageTypeStrList[1]] = "#00BFFF"
-        self.color_show_dict[GarbageType.GarbageTypeStrList[2]] = "#32CD32"
-        self.color_show_dict[GarbageType.GarbageTypeStrList[3]] = "#DC143C"
-        self.color_show_dict[GarbageType.GarbageTypeStrList[4]] = "#A9A9A9"
+        self.color_show_dict[GarbageType.GarbageTypeStrList_ch[1]] = "#00BFFF"
+        self.color_show_dict[GarbageType.GarbageTypeStrList_ch[2]] = "#32CD32"
+        self.color_show_dict[GarbageType.GarbageTypeStrList_ch[3]] = "#DC143C"
+        self.color_show_dict[GarbageType.GarbageTypeStrList_ch[4]] = "#A9A9A9"
 
     def refresh(self):
         super().refresh()
@@ -1994,7 +1996,7 @@ class StatisticsTimeTypeProgram(StatisticsTimeBaseProgram):
     @staticmethod
     def get_name(i: Tuple):
         data: bytes = i[2]
-        return GarbageType.GarbageTypeStrList[int(data.decode('utf-8'))]
+        return GarbageType.GarbageTypeStrList_ch[int(data.decode('utf-8'))]
 
 
 class StatisticsTimeTypeLocProgram(StatisticsTimeBaseProgram):
@@ -2010,7 +2012,7 @@ class StatisticsTimeTypeLocProgram(StatisticsTimeBaseProgram):
     @staticmethod
     def get_name(i: Tuple):
         data: bytes = i[2]
-        return f"{GarbageType.GarbageTypeStrList[int(data.decode('utf-8'))]}-{i[3]}"
+        return f"{GarbageType.GarbageTypeStrList_ch[int(data.decode('utf-8'))]}-{i[3]}"
 
 
 class StatisticsTimeCheckResultProgram(StatisticsTimeBaseProgram):
@@ -2046,7 +2048,7 @@ class StatisticsTimeCheckResultAndTypeProgram(StatisticsTimeBaseProgram):
         data_1: bytes = i[2]
         data_2: bytes = i[3]
         return ((f'Pass' if data_1 == DBBit.BIT_1 else 'Fail') +
-                f'-{GarbageType.GarbageTypeStrList[int(data_2.decode("utf-8"))]}')
+                f'-{GarbageType.GarbageTypeStrList_ch[int(data_2.decode("utf-8"))]}')
 
 
 class StatisticsTimeCheckResultAndLocProgram(StatisticsTimeBaseProgram):
@@ -2081,7 +2083,7 @@ class StatisticsTimeDetailProgram(StatisticsTimeBaseProgram):
         data_1: bytes = i[2]
         data_2: bytes = i[3]
         return ((f'Pass' if data_1 == DBBit.BIT_1 else 'Fail') +
-                f'-{GarbageType.GarbageTypeStrList[int(data_2.decode("utf-8"))]}' + f'-{i[4]}')
+                f'-{GarbageType.GarbageTypeStrList_ch[int(data_2.decode("utf-8"))]}' + f'-{i[4]}')
 
 
 all_program = [WelcomeProgram, CreateNormalUserProgram, CreateManagerUserProgram, CreateAutoNormalUserProgram,