浏览代码

feat: 汉化管理员界面

SongZihuan 3 年之前
父节点
当前提交
3f67416a3c
共有 9 个文件被更改,包括 356 次插入269 次删除
  1. 3 2
      conf/__init__.py
  2. 58 38
      control/admin.py
  3. 47 47
      control/admin_event.py
  4. 39 39
      control/admin_menu.py
  5. 144 128
      control/admin_program.py
  6. 30 9
      control/event.py
  7. 2 2
      control/ranking.py
  8. 12 4
      control/station.py
  9. 21 0
      control/station_event.py

+ 3 - 2
conf/__init__.py

@@ -43,8 +43,9 @@ qr_show_uid_len = 12  # qr 码上展示uid的长度
 tk_show_uid_len = qr_show_uid_len  # tk 界面上展示uid的长度
 ranking_tk_show_uid_len = tk_show_uid_len  # tk ranking 界面上展示uid的长度
 
-tk_win_bg = "#fffffb"  # tkinter manager 窗口 按钮标准颜色
-tk_btn_bg = "#dcdcdc"  # tkinter 按钮 按钮标准颜色
+tk_second_win_bg = "#fffffb"  # tkinter 第二窗口 标准颜色
+tk_win_bg = "#F0FFF0"  # tkinter 一般窗口 标准颜色 蜜瓜绿
+tk_btn_bg = "#dcdcdc"  # tkinter 按钮 标准颜色
 
 about_info = f'''
 HGSSystem is Garbage Sorting System

+ 58 - 38
control/admin.py

@@ -39,6 +39,12 @@ class CreateUserError(AdminStationException):
 
 
 class AdminStationBase(TkEventMain, metaclass=abc.ABCMeta):
+    """
+    AdminStation基类
+    封装管理员的相关操作
+    主要是柯里化 sql相关函数
+    """
+
     def __init__(self, db: DB):
         self._admin: Optional[User] = None
         self._db = db
@@ -186,15 +192,19 @@ class AdminStationBase(TkEventMain, metaclass=abc.ABCMeta):
         ...
 
     @abc.abstractmethod
-    def to_menu(self, name: str = "Main"):
+    def to_menu(self, name: str = "主页"):
+        ...
+
+    @abc.abstractmethod
+    def to_program(self, name: str = "欢迎页"):
         ...
 
     @abc.abstractmethod
-    def to_program(self, name: str = "Welcome"):
+    def show_msg(self, title, info, msg_type='提示'):
         ...
 
     @abc.abstractmethod
-    def show_msg(self, title, info, msg_type='info'):
+    def show_warning(self, title, info):
         ...
 
     @abc.abstractmethod
@@ -208,6 +218,12 @@ import admin_event as tk_event
 
 
 class AdminStation(AdminStationBase):
+    """
+    AdminStation 管理员系统
+    使用tkinter作为GUI
+    构造与GarbageStation类似
+    """
+
     def set_after_run(self, ms, func, *args):  # super.__init__可能会调用
         self.init_after_run_list.append((ms, func, args))
 
@@ -244,14 +260,14 @@ class AdminStation(AdminStationBase):
         self.__conf_create_menu()
         self.__conf_create_program()
         self.__conf_tk()
-        # self.__show_login_window()
+        # self.__show_login_window()  # 显示登录窗口, Debug期间暂时注释该代码
 
         self.__conf_set_after_run()
 
     def __conf_windows(self):
         self._window.title('HGSSystem: Manage Station')
         self._window.geometry(f'{self._win_width}x{self._win_height}')
-        self._window['bg'] = "#F0FFF0"
+        self._window['bg'] = conf.tk_win_bg
         self._window.resizable(False, False)
         self._window.protocol("WM_DELETE_WINDOW", lambda: self.main_exit())
 
@@ -281,7 +297,7 @@ class AdminStation(AdminStationBase):
 
     def __conf_font_size(self, n: int = 1):
         self._login_title_font_size = int(12 * n)
-        self._login_btn_font_size = int(11 * n)
+        self._login_btn_font_size = int(12 * n)
         self._win_ctrl_font_size = int(15 * n)
         self._menu_title_font_size = int(17 * n)
         self._program_title_font_size = int(14 * n)
@@ -308,13 +324,13 @@ class AdminStation(AdminStationBase):
             bt['font'] = title_font
 
         bt_main: tk.Button = self._win_ctrl_button[1]
-        bt_main['text'] = 'Main'
+        bt_main['text'] = '主页'
         bt_main['font'] = title_font_bold
         bt_main['command'] = lambda: self.__to_main_menu()
         bt_main.place(relx=0.02, rely=0.86, relwidth=0.96, relheight=0.06)
 
         bt_back: tk.Button = self._win_ctrl_button[0]
-        bt_back['text'] = 'Back'
+        bt_back['text'] = '后退'
         bt_back['font'] = title_font_bold
         bt_back['state'] = 'disable'
         bt_back['command'] = lambda: self.__to_back_menu()
@@ -322,17 +338,17 @@ class AdminStation(AdminStationBase):
 
         rely = 0.02
         bt_help: tk.Button = self._win_ctrl_button[2]
-        bt_help['text'] = 'Help'
+        bt_help['text'] = '帮助'
         bt_help['command'] = lambda: self.to_program()
         bt_help.place(relx=0.81, rely=rely, relwidth=0.05, relheight=0.05)
 
         bt_about: tk.Button = self._win_ctrl_button[3]
-        bt_about['text'] = 'About'
-        bt_about['command'] = lambda: self.to_program("About")
+        bt_about['text'] = '关于'
+        bt_about['command'] = lambda: self.to_program("关于")
         bt_about.place(relx=0.87, rely=rely, relwidth=0.05, relheight=0.05)
 
         bt_exit: tk.Button = self._win_ctrl_button[4]
-        bt_exit['text'] = 'Exit'
+        bt_exit['text'] = '退出'
         bt_exit['command'] = lambda: self.main_exit()
         bt_exit.place(relx=0.93, rely=rely, relwidth=0.05, relheight=0.05)
 
@@ -355,7 +371,7 @@ class AdminStation(AdminStationBase):
         frame_list = []
 
         for i in tk_menu.all_menu:
-            frame_list.append(i(self, self._menu_back, conf.tk_win_bg))
+            frame_list.append(i(self, self._menu_back, conf.tk_second_win_bg))
 
         for i in frame_list:
             name, _ = i.get_menu_frame()
@@ -367,25 +383,25 @@ class AdminStation(AdminStationBase):
             menu.conf_gui(conf.tk_btn_bg, n)
 
     def __conf_menu_title(self):
-        self._menu_back['bg'] = conf.tk_win_bg
+        self._menu_back['bg'] = conf.tk_second_win_bg
         self._menu_back['bd'] = 5
         self._menu_back['relief'] = "ridge"
 
         title_font = make_font(size=self._menu_title_font_size, weight="bold")
-        self._menu_title[0]['bg'] = conf.tk_win_bg
+        self._menu_title[0]['bg'] = conf.tk_second_win_bg
         self._menu_title[0]['font'] = title_font
         self._menu_title[0]['textvariable'] = self._menu_title[1]
 
         self._menu_line['bg'] = '#000000'
         # 不立即显示
 
-    def to_menu(self, name: str = "Main"):
+    def to_menu(self, name: str = "主页"):
         if self._menu_now is not None:
             self._menu_now[1].place_forget()
 
         menu = self._menu_dict.get(name)
         if menu is None:
-            self.show_msg("Menu not found", f"System can not found menu:\n  {name}")
+            self.show_msg("菜单错误", f"系统无法找到菜单:\n  {name}")
             return
 
         name, frame = menu.get_menu_frame()
@@ -401,7 +417,7 @@ class AdminStation(AdminStationBase):
         self.set_ctrl_back_button()
 
     def __conf_program_title(self):
-        self._program_back['bg'] = conf.tk_win_bg
+        self._program_back['bg'] = conf.tk_second_win_bg
         self._program_back['relief'] = "ridge"
         self._program_back['bd'] = 5
 
@@ -416,7 +432,7 @@ class AdminStation(AdminStationBase):
     def __conf_create_program(self):
         program_list = []
         for i in tk_program.all_program:
-            program_list.append(i(self, self._program_back, conf.tk_win_bg))
+            program_list.append(i(self, self._program_back, conf.tk_second_win_bg))
 
         for i in program_list:
             name, _ = i.get_program_frame()
@@ -427,13 +443,13 @@ class AdminStation(AdminStationBase):
             program = self._program_dict[i]
             program.conf_gui(n)
 
-    def to_program(self, name: str = "Welcome"):
+    def to_program(self, name: str = "欢迎页"):
         if self._program_now is not None:
             self._program_now[1].place_forget()
 
         program = self._program_dict.get(name)
         if program is None:
-            self.show_msg("Program not found", f"System can not found program:\n  {name}")
+            self.show_msg("程序错误", f"系统无法找到程序:\n  {name}")
             return
 
         name, frame = program.get_program_frame()
@@ -475,20 +491,20 @@ class AdminStation(AdminStationBase):
         title_font = make_font(size=self._msg_font_size + 1, weight="bold")
         info_font = make_font(size=self._msg_font_size - 1)
 
-        self._msg_frame['bg'] = conf.tk_win_bg
+        self._msg_frame['bg'] = conf.tk_second_win_bg
         self._msg_frame['bd'] = 5
         self._msg_frame['relief'] = "ridge"
         # frame 不会立即显示
 
         self._msg_label[0]['font'] = title_font
-        self._msg_label[0]['bg'] = conf.tk_win_bg
+        self._msg_label[0]['bg'] = conf.tk_second_win_bg
         self._msg_label[0]['anchor'] = 'w'
         self._msg_label[0]['textvariable'] = self._msg_label[2]
 
         self._msg_line['bg'] = '#000000'
 
         self._msg_label[1]['font'] = info_font
-        self._msg_label[1]['bg'] = conf.tk_win_bg
+        self._msg_label[1]['bg'] = conf.tk_second_win_bg
         self._msg_label[1]['anchor'] = 'nw'
         self._msg_label[1]['textvariable'] = self._msg_label[3]
         self._msg_label[1]['justify'] = 'left'
@@ -498,12 +514,12 @@ class AdminStation(AdminStationBase):
         self._msg_label[1].place(relx=0.075, rely=0.2, relwidth=0.85, relheight=0.58)
 
         self._msg_hide['font'] = info_font
-        self._msg_hide['text'] = 'close'
+        self._msg_hide['text'] = '关闭'
         self._msg_hide['bg'] = conf.tk_btn_bg
         self._msg_hide['command'] = lambda: self.hide_msg()
         self._msg_hide.place(relx=0.375, rely=0.80, relwidth=0.25, relheight=0.10)
 
-    def show_msg(self, title, info, msg_type='info'):
+    def show_msg(self, title, info, msg_type='提示'):
         assert not self._is_loading  # loading 时不显示msg
 
         self.set_all_btn_disable()
@@ -516,6 +532,9 @@ class AdminStation(AdminStationBase):
         self._msg_frame.place(relx=0.30, rely=0.25, relwidth=0.55, relheight=0.50)
         # 不隐藏元素, 隐藏后界面会显得单调
 
+    def show_warning(self, title, info):
+        self.show_msg(title, info, "警告")
+
     def hide_msg(self):
         self.set_reset_all_btn()
         self._msg_frame.place_forget()
@@ -549,7 +568,7 @@ class AdminStation(AdminStationBase):
         self.login_window: Optional[tk.Toplevel] = tk.Toplevel()
         self.login_window.title("HGSSystem Login")
 
-        height = int(self._sys_height * (1 / 6))
+        height = int(self._sys_height * (1 / 5))
         width = int(height * 2)
 
         if width > self._sys_width:
@@ -567,9 +586,10 @@ class AdminStation(AdminStationBase):
 
         self.__conf_login_window()
         self.hide_main()
+        self.login_window.deiconify()
 
     def __conf_login_window(self):
-        title_font = make_font(size=self._login_title_font_size, weight="bold")
+        title_font = make_font(size=self._login_title_font_size)
         btn_font = make_font(size=self._login_btn_font_size, weight="bold")
 
         self._login_frame['bg'] = "#EEE8AA"
@@ -577,7 +597,7 @@ class AdminStation(AdminStationBase):
         self._login_frame['relief'] = "ridge"
         self._login_frame.place(relx=0.1, rely=0.2, relwidth=0.8, relheight=0.45)
 
-        for lb, text in zip([self._login_name[0], self._login_passwd[0]], ["User:", "Passwd:"]):
+        for lb, text in zip([self._login_name[0], self._login_passwd[0]], ["账户:", "密码:"]):
             lb['bg'] = "#EEE8AA"
             lb['font'] = title_font
             lb['text'] = text
@@ -587,22 +607,22 @@ class AdminStation(AdminStationBase):
             lb['font'] = title_font
             lb['textvariable'] = var
 
-        self._login_name[0].place(relx=0.00, rely=0.13, relwidth=0.30, relheight=0.30)
-        self._login_passwd[0].place(relx=0.00, rely=0.53, relwidth=0.30, relheight=0.30)
+        self._login_name[0].place(relx=0.00, rely=0.13, relwidth=0.25, relheight=0.30)
+        self._login_passwd[0].place(relx=0.00, rely=0.53, relwidth=0.25, relheight=0.30)
 
-        self._login_name[1].place(relx=0.35, rely=0.13, relwidth=0.55, relheight=0.30)
+        self._login_name[1].place(relx=0.26, rely=0.13, relwidth=0.64, relheight=0.30)
         self._login_passwd[1]['show'] = "*"
-        self._login_passwd[1].place(relx=0.35, rely=0.53, relwidth=0.55, relheight=0.30)
+        self._login_passwd[1].place(relx=0.26, rely=0.53, relwidth=0.64, relheight=0.30)
 
         self._login_btn[0]['bg'] = conf.tk_btn_bg
         self._login_btn[0]['font'] = btn_font
-        self._login_btn[0]['text'] = 'Login'
+        self._login_btn[0]['text'] = '登录'
         self._login_btn[0]['command'] = lambda: self.login_call()
         self._login_btn[0].place(relx=0.54, rely=0.70, relwidth=0.16, relheight=0.15)
 
         self._login_btn[1]['bg'] = conf.tk_btn_bg
         self._login_btn[1]['font'] = btn_font
-        self._login_btn[1]['text'] = 'Exit'
+        self._login_btn[1]['text'] = '退出'
         self._login_btn[1]['command'] = lambda: self.login_exit()
         self._login_btn[1].place(relx=0.74, rely=0.70, relwidth=0.16, relheight=0.15)
 
@@ -616,7 +636,7 @@ class AdminStation(AdminStationBase):
             self.login_window = None
             self.show_main()
         else:
-            msg.showerror("Login error", "Please, try again")
+            msg.showerror("登录失败", "请重新尝试")
             self._login_name[2].set('')
             self._login_passwd[2].set('')
 
@@ -625,14 +645,14 @@ class AdminStation(AdminStationBase):
         self.__show_login_window()
 
     def login_exit(self):
-        if not msg.askokcancel('Sure?', 'Exit manager system.'):
+        if not msg.askokcancel('退出', '确定退出管理员系统吗?'):
             return
         if self.login_window is not None:
             self.login_window.destroy()
         self.exit_win()
 
     def main_exit(self):
-        if not msg.askokcancel('Sure?', 'Exit manager system.'):
+        if not msg.askokcancel('退出', '确定退出管理员系统吗?'):
             return
         self.exit_win()
 

+ 47 - 47
control/admin_event.py

@@ -67,10 +67,10 @@ class CreateUserEvent(AdminEventBase):
     def done_after_event(self):
         res: Optional[User] = self.thread.wait_event()
         if res is None:
-            self.station.show_msg("CreateUserError", f"Can't not create user: {self._name}", "Warning")
+            self.station.show_warning("创建用户错误", f"无法创建用户 user: {self._name}")
         else:
             name = res.get_name()
-            self.station.show_msg("CreateUser", f"create user {name} success")
+            self.station.show_msg("创建用户成功", f"成功创建{name}个新用户")
 
 
 class CreateGarbageEvent(AdminEventBase):
@@ -87,7 +87,7 @@ class CreateGarbageEvent(AdminEventBase):
 
     def done_after_event(self):
         res: list[tuple[str, Optional[GarbageBag]]] = self.thread.wait_event()
-        self.station.show_msg("CreateGarbage", f"create {len(res)} garbage finished.")
+        self.station.show_msg("创建垃圾袋", f"成功创建{len(res)}个垃圾袋")
 
 
 class ExportGarbageByIDEvent(AdminEventBase):
@@ -105,9 +105,9 @@ class ExportGarbageByIDEvent(AdminEventBase):
     def done_after_event(self):
         res: tuple[str, Optional[GarbageBag]] = self.thread.wait_event()
         if res[1] is None:
-            self.station.show_msg("ExportError", f"Export garbage error.")
+            self.station.show_warning("导出错误", f"无法导出垃圾袋二维码")
         else:
-            self.station.show_msg("ExportSuccess", f"Export garbage finished.")
+            self.station.show_msg("导出成功", f"成功导出垃圾袋二维码")
 
 
 class ExportGarbageAdvancedEvent(AdminEventBase):
@@ -124,7 +124,7 @@ class ExportGarbageAdvancedEvent(AdminEventBase):
 
     def done_after_event(self):
         res: list[tuple[str]] = self.thread.wait_event()
-        self.station.show_msg("Export", f"Export {len(res)} garbage finished.")
+        self.station.show_msg("导出完成", f"导出{len(res)}个垃圾袋二维码")
 
 
 class ExportUserByIDEvent(AdminEventBase):
@@ -142,9 +142,9 @@ class ExportUserByIDEvent(AdminEventBase):
     def done_after_event(self):
         res: tuple[str, Optional[GarbageBag]] = self.thread.wait_event()
         if res[1] is None:
-            self.station.show_msg("ExportError", f"Export user error.")
+            self.station.show_warning("导出错误", f"无法导出用户二维码")
         else:
-            self.station.show_msg("ExportSuccess", f"Export user finished.")
+            self.station.show_msg("导出成功", f"成功导出用户二维码")
 
 
 class ExportUserAdvancedEvent(AdminEventBase):
@@ -161,7 +161,7 @@ class ExportUserAdvancedEvent(AdminEventBase):
 
     def done_after_event(self):
         res: list[tuple[str]] = self.thread.wait_event()
-        self.station.show_msg("Export", f"Export {len(res)} user finished.")
+        self.station.show_msg("导出完成", f"导出{len(res)}个用户二维码")
 
 
 class CreateUserFromCSVEvent(AdminEventBase):
@@ -178,7 +178,7 @@ class CreateUserFromCSVEvent(AdminEventBase):
 
     def done_after_event(self):
         res: list[User] = self.thread.wait_event()
-        self.station.show_msg("Creat", f"Creat {len(res)} user finished.")
+        self.station.show_msg("创建完成", f"从CSV创建{len(res)}个新用户")
 
 
 class CreateAutoUserFromCSVEvent(AdminEventBase):
@@ -195,7 +195,7 @@ class CreateAutoUserFromCSVEvent(AdminEventBase):
 
     def done_after_event(self):
         res: list[User] = self.thread.wait_event()
-        self.station.show_msg("Creat", f"Creat {len(res)} auto user finished.")
+        self.station.show_msg("创建完成", f"从CSV创建{len(res)}个新用户")
 
 
 class DelUserEvent(AdminEventBase):
@@ -213,9 +213,9 @@ class DelUserEvent(AdminEventBase):
     def done_after_event(self):
         res: bool = self.thread.wait_event()
         if res:
-            self.station.show_msg("DeleteUser", f"Delete user finished.")
+            self.station.show_msg("删除成功", f"删除用户成功")
         else:
-            self.station.show_msg("DeleteUserError", f"Delete user failed.", "Warning")
+            self.station.show_warning("删除失败", f"删除用户失败")
 
 
 class DelUserFromWhereScanEvent(AdminEventBase):
@@ -232,9 +232,9 @@ class DelUserFromWhereScanEvent(AdminEventBase):
     def done_after_event(self):
         res: int = self.thread.wait_event()
         if res != -1:
-            self.station.show_msg("DeleteUserScan", f"Delete count: {res}")
+            self.station.show_msg("扫描结果", f"符合删除要素的用户个数: {res}")
         else:
-            self.station.show_msg("DeleteUserScanError", f"`Where` must be SQL")
+            self.station.show_warning("扫描结果", f"获取扫描结果失败")
 
 
 class DelUserFromWhereEvent(AdminEventBase):
@@ -251,22 +251,22 @@ class DelUserFromWhereEvent(AdminEventBase):
     def done_after_event(self):
         res: int = self.thread.wait_event()
         if res != -1:
-            self.station.show_msg("DeleteUser", f"Delete {res} user success")
+            self.station.show_msg("扫描结果", f"成功删除{res}个用户")
         else:
-            self.station.show_msg("DeleteUserError", f"`Where` must be SQL")
+            self.station.show_warning("扫描结果", f"获取扫描结果失败")
 
 
 class DelGarbageEvent(AdminEventBase):
     def func(self, gid, where):
         if where == 0:
-            return 1 if self.station.del_garbage(gid) else -1
+            return self.station.del_garbage(gid)
         elif where == 1:
-            return 1 if self.station.del_garbage_not_use(gid) else -1
+            return self.station.del_garbage_not_use(gid)
         elif where == 2:
-            return 1 if self.station.del_garbage_wait_check(gid) else -1
+            return self.station.del_garbage_wait_check(gid)
         elif where == 3:
-            return 1 if self.station.del_garbage_has_check(gid) else -1
-        return -1
+            return self.station.del_garbage_has_check(gid)
+        return False
 
     def __init__(self, station):
         super(DelGarbageEvent, self).__init__(station)
@@ -276,11 +276,11 @@ class DelGarbageEvent(AdminEventBase):
         return self
 
     def done_after_event(self):
-        res: int = self.thread.wait_event()
-        if res != -1:
-            self.station.show_msg("DeleteGarbage", f"Delete {res} garbage success")
+        res: bool = self.thread.wait_event()
+        if res:
+            self.station.show_msg("删除成功", f"成功删除垃圾袋")
         else:
-            self.station.show_msg("DeleteGarbageError", f"Delete error")
+            self.station.show_warning("删除失败", f"删除垃圾袋失败")
 
 
 class DelGarbageWhereEvent(AdminEventBase):
@@ -303,9 +303,9 @@ class DelGarbageWhereEvent(AdminEventBase):
     def done_after_event(self):
         res: int = self.thread.wait_event()
         if res != -1:
-            self.station.show_msg("DeleteGarbage", f"Delete {res} garbage success")
+            self.station.show_msg("删除成功", f"成功删除{res}个垃圾袋")
         else:
-            self.station.show_msg("DeleteGarbageError", f"Delete error")
+            self.station.show_warning("删除失败", f"垃圾袋删除失败")
 
 
 class DelGarbageWhereScanEvent(AdminEventBase):
@@ -328,9 +328,9 @@ class DelGarbageWhereScanEvent(AdminEventBase):
     def done_after_event(self):
         res: int = self.thread.wait_event()
         if res != -1:
-            self.station.show_msg("DeleteGarbageScan", f"Delete count: {res}")
+            self.station.show_msg("扫描结果", f"符合删除要素的垃圾袋个数: {res}")
         else:
-            self.station.show_msg("DeleteGarbageScanError", f"Delete scan error")
+            self.station.show_warning("扫描结果", f"获取扫描结果失败")
 
 
 class DelAllGarbageScanEvent(AdminEventBase):
@@ -344,9 +344,9 @@ class DelAllGarbageScanEvent(AdminEventBase):
     def done_after_event(self):
         res: int = self.thread.wait_event()
         if res != -1:
-            self.station.show_msg("DeleteAllGarbageScan", f"Delete count: {res}")
+            self.station.show_msg("扫描结果", f"全部垃圾袋个数: {res}")
         else:
-            self.station.show_msg("DeleteAllGarbageError", f"Delete scan error")
+            self.station.show_warning("扫描结果", f"获取扫描结果失败")
 
 
 class DelAllGarbageEvent(AdminEventBase):
@@ -360,9 +360,9 @@ class DelAllGarbageEvent(AdminEventBase):
     def done_after_event(self):
         res: int = self.thread.wait_event()
         if res != -1:
-            self.station.show_msg("DeleteAllGarbage", f"Delete all[{res}] garbage success")
+            self.station.show_msg("删除成功", f"成功删除所用[共计{res}个]垃圾袋")
         else:
-            self.station.show_msg("DeleteAllGarbageError", f"Delete error")
+            self.station.show_warning("删除失败", f"删除所有垃圾袋失败")
 
 
 class SearchUserEvent(AdminEventBase):
@@ -381,7 +381,7 @@ class SearchUserEvent(AdminEventBase):
     def done_after_event(self):
         res: list[list] = self.thread.wait_event()
         if res is None or self.program is None:
-            self.station.show_msg("Search User Error", f"Search error")
+            self.station.show_warning("搜索失败", f"搜索用户失败")
             return
         for i in self.program.view.get_children():
             self.program.view.delete(i)
@@ -405,7 +405,7 @@ class SearchUserAdvancedEvent(AdminEventBase):
     def done_after_event(self):
         res: list[list] = self.thread.wait_event()
         if res is None or self.program is None:
-            self.station.show_msg("Search User Advanced Error", f"Search error")
+            self.station.show_warning("高级搜索失败", f"高级搜索用户失败")
             return
         for i in self.program.view.get_children():
             self.program.view.delete(i)
@@ -429,7 +429,7 @@ class SearchGarbageEvent(AdminEventBase):
     def done_after_event(self):
         res: list[list] = self.thread.wait_event()
         if res is None or self.program is None:
-            self.station.show_msg("Search Garbage Error", f"Search error")
+            self.station.show_warning("搜索失败", f"搜索垃圾袋失败")
             return
         for i in self.program.view.get_children():
             self.program.view.delete(i)
@@ -453,7 +453,7 @@ class SearchGarbageAdvancedEvent(AdminEventBase):
     def done_after_event(self):
         res: list[list] = self.thread.wait_event()
         if res is None or self.program is None:
-            self.station.show_msg("Search Garbage Advanced Error", f"Search error")
+            self.station.show_warning("高级搜索失败", f"高级搜索垃圾袋失败")
             return
         for i in self.program.view.get_children():
             self.program.view.delete(i)
@@ -477,7 +477,7 @@ class SearchAdvancedEvent(AdminEventBase):
     def done_after_event(self):
         res: list[list] = self.thread.wait_event()
         if res is None or self.program is None:
-            self.station.show_msg("Search Advanced Error", f"Search error")
+            self.station.show_warning("高级搜索失败", f"高级搜索失败")
             return
         for i in self.program.view.get_children():
             self.program.view.delete(i)
@@ -499,9 +499,9 @@ class UpdateUserScoreEvent(AdminEventBase):
     def done_after_event(self):
         res: int = self.thread.wait_event()
         if res == -1:
-            self.station.show_msg("UpdateError", f"Update user score error")
+            self.station.show_warning("更新失败", f"更新用户-积分失败")
         else:
-            self.station.show_msg("Update", f"Update {res} user score success")
+            self.station.show_msg("更新成功", f"成功更新{res}个用户-积分")
 
 
 class UpdateUserReputationEvent(AdminEventBase):
@@ -518,9 +518,9 @@ class UpdateUserReputationEvent(AdminEventBase):
     def done_after_event(self):
         res: int = self.thread.wait_event()
         if res == -1:
-            self.station.show_msg("UpdateError", f"Update user reputation error")
+            self.station.show_warning("更新失败", f"更新用户-垃圾分类信用失败")
         else:
-            self.station.show_msg("Update", f"Update {res} user reputation success")
+            self.station.show_msg("更新成功", f"成功更新{res}个用户-垃圾分类信用")
 
 
 class UpdateGarbageTypeEvent(AdminEventBase):
@@ -537,9 +537,9 @@ class UpdateGarbageTypeEvent(AdminEventBase):
     def done_after_event(self):
         res: int = self.thread.wait_event()
         if res == -1:
-            self.station.show_msg("UpdateError", f"Update garbage type error")
+            self.station.show_warning("更新失败", f"更新垃圾袋-垃圾类型失败")
         else:
-            self.station.show_msg("Update", f"Update {res} garbage type success")
+            self.station.show_msg("更新成功", f"成功更新{res}个垃圾袋-垃圾类型")
 
 
 class UpdateGarbageCheckEvent(AdminEventBase):
@@ -556,6 +556,6 @@ class UpdateGarbageCheckEvent(AdminEventBase):
     def done_after_event(self):
         res: int = self.thread.wait_event()
         if res == -1:
-            self.station.show_msg("UpdateError", f"Update garbage check result error")
+            self.station.show_warning("更新失败", f"更新垃圾袋-检测结果失败")
         else:
-            self.station.show_msg("Update", f"Update {res} garbage check result success")
+            self.station.show_msg("更新成功", f"成功更新{res}个垃圾袋-检测结果")

+ 39 - 39
control/admin_menu.py

@@ -47,9 +47,9 @@ class AdminMenu(metaclass=abc.ABCMeta):
 
 class MainMenu(AdminMenu):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "Main")
+        super().__init__(station, win, color, "主页")
         self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(5)]
-        self.btn_name = ["Create", "Delete", "Search", "Update", "Logout"]
+        self.btn_name = ["创建", "删除", "搜索", "更新", "退出登录"]
 
     def conf_gui(self, color: str, n: int = 1):
         super().conf_gui(color, n)
@@ -60,16 +60,16 @@ class MainMenu(AdminMenu):
         self.btn[4]['command'] = lambda: self.logout_command()
 
     def create_command(self):
-        self.station.to_menu("Create")
+        self.station.to_menu("创建")
 
     def delete_command(self):
-        self.station.to_menu("Delete")
+        self.station.to_menu("删除")
 
     def search_command(self):
-        self.station.to_menu("Search")
+        self.station.to_menu("搜索")
 
     def update_command(self):
-        self.station.to_menu("Update")
+        self.station.to_menu("更新")
 
     def logout_command(self):
         self.station.logout()
@@ -77,10 +77,10 @@ class MainMenu(AdminMenu):
 
 class CreateMenu(AdminMenu):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "Create")
+        super().__init__(station, win, color, "创建")
         self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(7)]
-        self.btn_name = ["NormalUser", "AutoNormalUser", "ManagerUser", "Garbage",
-                         "ExportUser", "ExportGarbage", "User From CSV"]
+        self.btn_name = ["普通用户", "自动创建", "管理员用户", "垃圾袋",
+                         "导出用户二维码", "导出垃圾袋二维码", "从CSV导入用户"]
 
     def conf_gui(self, color: str, n: int = 1):
         super().conf_gui(color, n)
@@ -93,32 +93,32 @@ class CreateMenu(AdminMenu):
         self.btn[6]['command'] = lambda: self.create_user_from_csv()
 
     def create_normal_user(self):
-        self.station.to_program("CreateNormalUser")
+        self.station.to_program("创建普通用户")
 
     def create_auto_user(self):
-        self.station.to_program("CreateAutoNormalUser")
+        self.station.to_program("创建自动用户")
 
     def create_manager_user(self):
-        self.station.to_program("CreateManagerUser")
+        self.station.to_program("创建管理员")
 
     def create_garbage(self):
-        self.station.to_program("CreateGarbage")
+        self.station.to_program("创建垃圾袋")
 
     def export_user(self):
-        self.station.to_program("ExportUser")
+        self.station.to_program("导出用户二维码")
 
     def export_garbage(self):
-        self.station.to_program("ExportGarbage")
+        self.station.to_program("导出垃圾袋二维码")
 
     def create_user_from_csv(self):
-        self.station.to_program("CreateUserFromCSV")
+        self.station.to_program("从CSV导入用户")
 
 
 class DeleteMenu(AdminMenu):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "Delete")
+        super().__init__(station, win, color, "删除")
         self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(5)]
-        self.btn_name = ["User", "UserMore", "Garbage", "GarbageMore", "AllGarbage"]
+        self.btn_name = ["用户", "多个用户", "垃圾袋", "多个垃圾袋", "所有垃圾袋"]
 
     def conf_gui(self, color: str, n: int = 1):
         super().conf_gui(color, n)
@@ -129,26 +129,26 @@ class DeleteMenu(AdminMenu):
         self.btn[4]['command'] = lambda: self.del_all_garbage()
 
     def del_user(self):
-        self.station.to_program("DeleteUser")
+        self.station.to_program("删除用户")
 
     def del_users(self):
-        self.station.to_program("DeleteUsers")
+        self.station.to_program("删除多个用户")
 
     def del_garbage(self):
-        self.station.to_program("DeleteGarbage")
+        self.station.to_program("删除垃圾袋")
 
     def del_garbage_more(self):
-        self.station.to_program("DeleteGarbageMore")
+        self.station.to_program("删除多个垃圾袋")
 
     def del_all_garbage(self):
-        self.station.to_program("DeleteAllGarbage")
+        self.station.to_program("删除所有垃圾袋")
 
 
 class SearchMenu(AdminMenu):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "Search")
+        super().__init__(station, win, color, "搜索")
         self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(6)]
-        self.btn_name = ["User", "UserAdvanced", "Garbage", "GarbageAdvanced", "Advanced", "Statistics"]
+        self.btn_name = ["用户", "高级搜索-用户", "垃圾袋", "高级搜索-垃圾袋", "高级搜索", "数据分析"]
 
     def conf_gui(self, color: str, n: int = 1):
         super().conf_gui(color, n)
@@ -160,29 +160,29 @@ class SearchMenu(AdminMenu):
         self.btn[5]['command'] = lambda: self.statistics_command()
 
     def user_command(self):
-        self.station.to_program("SearchUser")
+        self.station.to_program("搜索用户")
 
     def user_advanced_command(self):
-        self.station.to_program("SearchUserAdvanced")
+        self.station.to_program("高级搜索-用户")
 
     def garbage_command(self):
-        self.station.to_program("SearchGarbage")
+        self.station.to_program("搜索垃圾袋")
 
     def garbage_advanced_command(self):
-        self.station.to_program("SearchGarbageAdvanced")
+        self.station.to_program("高级搜索-垃圾袋")
 
     def advanced_command(self):
-        self.station.to_program("SearchAdvanced")
+        self.station.to_program("高级搜索")
 
     def statistics_command(self):
-        self.station.to_menu("Statistics")
+        self.station.to_menu("数据分析")
 
 
 class UpdateMenu(AdminMenu):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "Update")
+        super().__init__(station, win, color, "更新")
         self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(4)]
-        self.btn_name = ["Score", "Reputation", "GarbageType", "GarbageCheck"]
+        self.btn_name = ["用户-积分", "用户-累计分类信用", "垃圾袋-垃圾类型", "垃圾袋-检测结果"]
 
     def conf_gui(self, color: str, n: int = 1):
         super().conf_gui(color, n)
@@ -192,23 +192,23 @@ class UpdateMenu(AdminMenu):
         self.btn[3]['command'] = lambda: self.update_garbage_result_command()
 
     def update_reputation_command(self):
-        self.station.to_program("UpdateReputation")
+        self.station.to_program("更新用户-垃圾分类信用")
 
     def update_score_command(self):
-        self.station.to_program("UpdateScore")
+        self.station.to_program("更新用户-积分")
 
     def update_garbage_type_command(self):
-        self.station.to_program("UpdateGarbageType")
+        self.station.to_program("更新垃圾袋-垃圾类型")
 
     def update_garbage_result_command(self):
-        self.station.to_program("UpdateGarbageCheckResult")
+        self.station.to_program("更新垃圾袋-检测结果")
 
 
 class StatisticsMenu(AdminMenu):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "Statistics")
+        super().__init__(station, win, color, "数据分析")
         self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(5)]
-        self.btn_name = ["Time", "Score", "Reputation", "BlackUser", "PassingRate"]
+        self.btn_name = ["时间分析", "积分分析", "信用分析", "失信用户", "通过率"]
 
     def conf_gui(self, color: str, n: int = 1):
         super().conf_gui(color, n)

+ 144 - 128
control/admin_program.py

@@ -42,7 +42,7 @@ class AdminProgram(metaclass=abc.ABCMeta):
 
 class WelcomeProgram(AdminProgram):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "Welcome")
+        super().__init__(station, win, color, "欢迎页")
 
         self.title = tk.Label(self.frame)
         self.info = tk.Label(self.frame)
@@ -60,7 +60,7 @@ class WelcomeProgram(AdminProgram):
 
         self.title['font'] = title_font
         self.title['bg'] = self.color
-        self.title['text'] = 'Welcome to HGSSystem Manager\n[Help Page]'
+        self.title['text'] = '欢迎使用 HGSSystem 管理员系统\n[帮助]'
 
         self.info['bg'] = self.color
         self.info['font'] = info_font
@@ -69,13 +69,13 @@ class WelcomeProgram(AdminProgram):
         self.info['text'] = (f'''
 HGSSystem 管理者界面:
   1) 点击菜单按钮进入子菜单或程序
-  2) Creat 菜单包含创建类的程序
-  3) Delete 菜单包含删除类的程序
-  4) Search 菜单包含数据分析类的程序
-  5) Update 菜单包含数据更新类的程序
-  6当离开操作系统时请退出登录以确保安全
-  7只能使用具有管理员权限的账号登陆系统
-  8只有admin用户可以完成危险操作(例如删除所有垃圾袋数据)
+  2) 创建 菜单包含创建类的程序
+  3) 删除 菜单包含删除类的程序
+  4) 搜索 菜单包含数据分析类的程序
+  5) 更新 菜单包含数据更新类的程序
+  6) 当离开操作系统时请退出登录以确保安全
+  7) 只能使用具有管理员权限的账号登陆系统
+  8) 只有admin用户可以完成危险操作(例如删除所有垃圾袋数据)
 
 程序的运行:
   1) 在菜单中选中程序后,根据程序界面提示完成操作
@@ -100,11 +100,10 @@ HGSSystem 管理者界面:
 
 class AboutProgram(AdminProgram):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "About")
+        super().__init__(station, win, color, "关于")
 
         self.title = tk.Label(self.frame)
         self.info = tk.Label(self.frame)
-        self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(2)]
         self.__conf_font()
 
     def __conf_font(self, n: int = 1):
@@ -119,7 +118,7 @@ class AboutProgram(AdminProgram):
 
         self.title['font'] = title_font
         self.title['bg'] = self.color
-        self.title['text'] = 'About HGSSystem Manager\n[About Page]'
+        self.title['text'] = '关于 HGSSystem 管理员系统'
 
         self.info['bg'] = self.color
         self.info['font'] = info_font
@@ -130,18 +129,11 @@ class AboutProgram(AdminProgram):
         self.title.place(relx=0.1, rely=0.0, relwidth=0.8, relheight=0.2)
         self.info.place(relx=0.05, rely=0.21, relwidth=0.90, relheight=0.75)
 
-    def test_progress(self):
-        event = tk_event.TestProgressEvent(self.station)
-        self.station.push_event(event)
-
-    def test_msg(self):
-        self.station.show_msg("Test Msg", "test msg")
-
     def set_disable(self):
-        set_tk_disable_from_list(self.btn)
+        pass
 
     def reset_disable(self):
-        set_tk_disable_from_list(self.btn, flat='normal')
+        pass
 
 
 class CreateUserProgramBase(AdminProgram):
@@ -152,7 +144,7 @@ class CreateUserProgramBase(AdminProgram):
         self.title: List[tk.Label] = [tk.Label(self.enter_frame) for _ in range(3)]
         self.enter: List[tk.Entry] = [tk.Entry(self.enter_frame) for _ in range(3)]
         self.var: List[tk.Variable] = [tk.StringVar() for _ in range(3)]
-        self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(2)]  # create(生成用户) try(计算uid)
+        self.btn: List[tk.Button] = [tk.Button(self.frame) for _ in range(2)]
 
         self._conf("#FA8072", False)  # 默认颜色
         self.__conf_font()
@@ -178,7 +170,7 @@ class CreateUserProgramBase(AdminProgram):
         self.enter_frame.place(relx=0.2, rely=0.3, relwidth=0.6, relheight=0.30)
 
         height = 0.1
-        for lb, text, enter, var in zip(self.title, ["UserName:", "PassWord:", "Phone:"], self.enter, self.var):
+        for lb, text, enter, var in zip(self.title, ["用户名:", "用户密码:", "手机号:"], self.enter, self.var):
             lb['font'] = title_font
             lb['text'] = text
             lb['bg'] = self.bg_color
@@ -192,7 +184,7 @@ class CreateUserProgramBase(AdminProgram):
             height += 0.30
 
         for btn, text, x, func in zip(self.btn,
-                                      ["Create", "GetUID"],
+                                      ["创建用户", "获取用户ID"],
                                       [0.2, 0.6],
                                       [lambda: self.create_by_name(), lambda: self.get_uid()]):
             btn['font'] = btn_font
@@ -207,7 +199,7 @@ class CreateUserProgramBase(AdminProgram):
         phone: str = self.var[2].get()
 
         if len(name) == 0 or len(passwd) == 0 or len(phone) != 11:
-            self.station.show_msg("UserInfoError", "Please, enter UserName/Passwd/Phone(11)")
+            self.station.show_msg("用户创建失败", "请再次尝试, 输入用户名, 用户密码和11位手机号")
             return None
 
         return name, passwd, phone
@@ -226,7 +218,7 @@ class CreateUserProgramBase(AdminProgram):
             return
         name, passwd, phone = res
         uid = create_uid(name, passwd, phone)
-        self.station.show_msg("UserID", f"UserName: {name}\nUserID: {uid}")
+        self.station.show_msg("获取用户ID", f"用户名: {name}\n用户ID: {uid}")
 
     def set_disable(self):
         set_tk_disable_from_list(self.btn)
@@ -239,18 +231,18 @@ class CreateUserProgramBase(AdminProgram):
 
 class CreateNormalUserProgram(CreateUserProgramBase):
     def __init__(self, station, win, color):
-        super(CreateNormalUserProgram, self).__init__(station, win, color, "CreateNormalUser")
+        super(CreateNormalUserProgram, self).__init__(station, win, color, "创建普通用户")
 
 
 class CreateManagerUserProgram(CreateUserProgramBase):
     def __init__(self, station, win, color):
-        super(CreateManagerUserProgram, self).__init__(station, win, color, "CreateManagerUser")
+        super(CreateManagerUserProgram, self).__init__(station, win, color, "创建管理员")
         self._conf("#4b5cc4", True)
 
 
 class CreateAutoNormalUserProgram(AdminProgram):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "CreateAutoNormalUser")
+        super().__init__(station, win, color, "创建自动用户")
 
         self.enter_frame = tk.Frame(self.frame)
         self.title: tk.Label = tk.Label(self.enter_frame)
@@ -276,7 +268,7 @@ class CreateAutoNormalUserProgram(AdminProgram):
         self.enter_frame.place(relx=0.2, rely=0.3, relwidth=0.6, relheight=0.12)
 
         self.title['font'] = title_font
-        self.title['text'] = "Phone:"
+        self.title['text'] = "手机号:"
         self.title['bg'] = "#bce672"
         self.title['anchor'] = 'e'
 
@@ -287,7 +279,7 @@ class CreateAutoNormalUserProgram(AdminProgram):
         self.enter.place(relx=0.30, rely=0.25, relwidth=0.60, relheight=0.50)
 
         self.btn['font'] = btn_font
-        self.btn['text'] = "Create"
+        self.btn['text'] = "创建用户"
         self.btn['bg'] = conf.tk_btn_bg
         self.btn['command'] = lambda: self.create_user()
         self.btn.place(relx=0.4, rely=0.7, relwidth=0.2, relheight=0.08)
@@ -310,7 +302,7 @@ class CreateAutoNormalUserProgram(AdminProgram):
 
 class CreateGarbageProgram(AdminProgram):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "CreateGarbage")
+        super().__init__(station, win, color, "创建垃圾袋")
 
         self.enter_frame = tk.Frame(self.frame)
         self.title: List[tk.Label] = [tk.Label(self.enter_frame), tk.Label(self.enter_frame)]
@@ -337,7 +329,7 @@ class CreateGarbageProgram(AdminProgram):
         self.enter_frame.place(relx=0.2, rely=0.3, relwidth=0.6, relheight=0.17)
 
         height = 0.1
-        for lb, text, enter, var in zip(self.title, ["Count:", "Export:"], self.enter, self.var):
+        for lb, text, enter, var in zip(self.title, ["数量:", "二维码导出位置:"], self.enter, self.var):
             lb['font'] = title_font
             lb['text'] = text
             lb['bg'] = "#b69968"
@@ -351,7 +343,7 @@ class CreateGarbageProgram(AdminProgram):
             height += 0.43
 
         for btn, text, x, func in zip([self.create_btn, self.file_btn],
-                                      ["Create", "ChoosePath"],
+                                      ["创建垃圾袋", "选择目录"],
                                       [0.2, 0.6],
                                       [lambda: self.create_garbage(), lambda: self.choose_file()]):
             btn['font'] = btn_font
@@ -361,7 +353,7 @@ class CreateGarbageProgram(AdminProgram):
             btn.place(relx=x, rely=0.7, relwidth=0.2, relheight=0.08)
 
     def choose_file(self):
-        path = askdirectory(title='path to save qr code')
+        path = askdirectory(title='选择二维码导出位置')
         self.var[1].set(path)
 
     def create_garbage(self):
@@ -370,7 +362,7 @@ class CreateGarbageProgram(AdminProgram):
             if count <= 0:
                 raise ValueError
         except (ValueError, TypeError):
-            self.station.show_msg("TypeError", "Count must be number > 1")
+            self.station.show_msg("类型错误", "数量必须为大于0的数字")
         else:
             path = self.var[1].get()
             if len(path) == 0:
@@ -479,11 +471,11 @@ class ExportProgramBase(AdminProgram):
         self.file_btn[0].place(relx=0.6, rely=0.79, relwidth=0.2, relheight=0.08)
 
     def choose_file_id(self):
-        path = askdirectory(title='path to save qr code')
+        path = askdirectory(title='选择二维码导出位置')
         self.gid_var[1].set(path)
 
     def choose_file_where(self):
-        path = askdirectory(title='path to save qr code')
+        path = askdirectory(title='选择二维码导出位置')
         self.where_var[1].set(path)
 
     def export_id(self):
@@ -505,9 +497,9 @@ class ExportProgramBase(AdminProgram):
 
 class ExportGarbageProgram(ExportProgramBase):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "ExportGarbage")
-        self._conf("#afdfe4", ["GarbageID:", "Export:"], ["Where:", "Export:"],
-                   ["Export By GarbageID", "Export Advanced", "ChoosePath", "ChoosePath"])
+        super().__init__(station, win, color, "导出垃圾袋二维码")
+        self._conf("#afdfe4", ["垃圾袋ID:", "导出位置:"], ["条件:", "导出位置:"],
+                   ["根据垃圾袋ID导出", "根据条件导出", "选择目录", "选择目录"])
 
     def export_id(self):
         gid = self.gid_var[0].get()
@@ -524,9 +516,9 @@ class ExportGarbageProgram(ExportProgramBase):
 
 class ExportUserProgram(ExportProgramBase):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "ExportUser")
-        self._conf("#f69c9f", ["UserID:", "Export:"], ["Where:", "Export:"],
-                   ["Export By UserID", "Export Advanced", "ChoosePath", "ChoosePath"])
+        super().__init__(station, win, color, "导出用户二维码")
+        self._conf("#f69c9f", ["用户ID:", "导出位置:"], ["条件:", "导出位置:"],
+                   ["根据用户ID导出", "根据条件导出", "选择目录", "选择目录"])
 
     def export_id(self):
         uid = self.gid_var[0].get()
@@ -543,7 +535,7 @@ class ExportUserProgram(ExportProgramBase):
 
 class CreateUserFromCSVProgram(AdminProgram):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "CreateUserFromCSV")
+        super().__init__(station, win, color, "从CSV导入用户")
 
         self.auto_frame = tk.Frame(self.frame)
         self.auto_title: tk.Label = tk.Label(self.auto_frame)
@@ -581,12 +573,12 @@ class CreateUserFromCSVProgram(AdminProgram):
         self.auto_frame.place(relx=0.2, rely=0.6, relwidth=0.6, relheight=0.12)
 
         self.auto_title['font'] = title_font
-        self.auto_title['text'] = "Path:"
+        self.auto_title['text'] = "CSV文件:"
         self.auto_title['bg'] = "#EEE8AA"
         self.auto_title['anchor'] = 'e'
 
         self.path_title['font'] = title_font
-        self.path_title['text'] = "Path:"
+        self.path_title['text'] = "CSV文件:"
         self.path_title['bg'] = "#EEE8AA"
         self.path_title['anchor'] = 'e'
 
@@ -603,7 +595,7 @@ class CreateUserFromCSVProgram(AdminProgram):
         self.path_enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
 
         for btn, text in zip(self.create_btn + self.file_btn,
-                             ["Create User", "Create Auto User", "Choose CSV", "Choose CSV"]):
+                             ["创建用户", "创建自动用户", "选择CSV", "选择CSV"]):
             btn['font'] = btn_font
             btn['text'] = text
             btn['bg'] = conf.tk_btn_bg
@@ -619,11 +611,11 @@ class CreateUserFromCSVProgram(AdminProgram):
         self.file_btn[1].place(relx=0.6, rely=0.74, relwidth=0.2, relheight=0.08)
 
     def choose_file_auto(self):
-        path = askopenfilename(title='path of csv', filetypes=[("CSV", ".csv")])
+        path = askopenfilename(title='选择CSV文件', filetypes=[("CSV", ".csv")])
         self.auto_var.set(path)
 
     def choose_file(self):
-        path = askopenfilename(title='path of csv', filetypes=[("CSV", ".csv")])
+        path = askopenfilename(title='选择CSV文件', filetypes=[("CSV", ".csv")])
         self.path_var.set(path)
 
     def create_auto(self):
@@ -651,7 +643,7 @@ class CreateUserFromCSVProgram(AdminProgram):
 
 class DeleteUserProgram(AdminProgram):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "DeleteUser")
+        super().__init__(station, win, color, "删除用户")
 
         self.uid_frame = tk.Frame(self.frame)
         self.uid_title: tk.Label = tk.Label(self.uid_frame)
@@ -688,7 +680,7 @@ class DeleteUserProgram(AdminProgram):
         self.name_frame.place(relx=0.2, rely=0.48, relwidth=0.6, relheight=0.25)
 
         height = 0.17
-        for lb, text, enter, var in zip(self.name_title, ["UserName:", "PassWord:"], self.name_enter, self.name_var):
+        for lb, text, enter, var in zip(self.name_title, ["用户名:", "密码:"], self.name_enter, self.name_var):
             lb['font'] = title_font
             lb['text'] = text
             lb['bg'] = "#FA8072"
@@ -702,7 +694,7 @@ class DeleteUserProgram(AdminProgram):
             height += 0.45
 
         self.uid_title['font'] = title_font
-        self.uid_title['text'] = "UserID:"
+        self.uid_title['text'] = "用户ID:"
         self.uid_title['bg'] = "#FA8072"
         self.uid_title['anchor'] = 'e'
 
@@ -713,7 +705,7 @@ class DeleteUserProgram(AdminProgram):
         self.uid_enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
 
         for btn, text, func in zip(self.btn,
-                                   ["Delete By Uid", "Delete By Name"],
+                                   ["通过用户ID删除", "通过用户名删除"],
                                    [lambda: self.del_by_uid(), lambda: self.del_by_name()]):
             btn['font'] = btn_font
             btn['text'] = text
@@ -726,7 +718,7 @@ class DeleteUserProgram(AdminProgram):
     def del_by_uid(self):
         uid = self.uid_var.get()
         if len(uid) != 32:
-            self.station.show_msg("UserID Error", "Len of UserID must be 32", "Error")
+            self.station.show_warning("用户ID错误", "用户ID必须为32位")
             return
         event = tk_event.DelUserEvent(self.station).start(uid)
         self.station.push_event(event)
@@ -735,7 +727,7 @@ class DeleteUserProgram(AdminProgram):
         name = self.name_var[0].get()
         passwd = self.name_var[1].get()
         if len(name) == 0 or len(passwd) == 0:
-            self.station.show_msg("UserName/Password Error", "You should enter UserName and Password", "Error")
+            self.station.show_warning("用户名或密码错误", "请输入用户名和密码")
             return
         uid = create_uid(name, passwd)
         event = tk_event.DelUserEvent(self.station).start(uid)
@@ -754,7 +746,7 @@ class DeleteUserProgram(AdminProgram):
 
 class DeleteUsersProgram(AdminProgram):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "DeleteUsers")
+        super().__init__(station, win, color, "删除多个用户")
 
         self.enter_frame = tk.Frame(self.frame)
         self.title: tk.Label = tk.Label(self.enter_frame)
@@ -781,7 +773,7 @@ class DeleteUsersProgram(AdminProgram):
         self.enter_frame.place(relx=0.2, rely=0.30, relwidth=0.6, relheight=0.10)
 
         self.title['font'] = title_font
-        self.title['text'] = "Where:"
+        self.title['text'] = "条件:"
         self.title['anchor'] = 'e'
         self.title['bg'] = "#48c0a3"
 
@@ -792,7 +784,7 @@ class DeleteUsersProgram(AdminProgram):
         self.enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
 
         for btn, text, x, func in zip(self.btn,
-                                      ["Delete", "Scan"],
+                                      ["删除", "扫描"],
                                       [0.2, 0.6],
                                       [lambda: self.delete_user(), lambda: self.scan_user()]):
             btn['font'] = btn_font
@@ -804,7 +796,7 @@ class DeleteUsersProgram(AdminProgram):
     def delete_user(self):
         where = self.var.get()
         if len(where) == 0:
-            self.station.show_msg("`Where`Error", "`Where` must be SQL", "Warning")
+            self.station.show_warning("条件错误", "条件必须为正确的SQL语句")
             return
         event = tk_event.DelUserFromWhereEvent(self.station).start(where)
         self.station.push_event(event)
@@ -812,7 +804,7 @@ class DeleteUsersProgram(AdminProgram):
     def scan_user(self):
         where = self.var.get()
         if len(where) == 0:
-            self.station.show_msg("`Where`Error", "`Where` must be SQL", "Warning")
+            self.station.show_warning("条件错误", "条件必须为正确的SQL语句")
             return
         event = tk_event.DelUserFromWhereScanEvent(self.station).start(where)
         self.station.push_event(event)
@@ -843,7 +835,7 @@ class DeleteGarbageProgramBase(AdminProgram):
         self.__conf_font()
         self._conf()
 
-    def _conf(self, title: str = "GarbageID:", color: str = "#b69968", support_del_all: bool = True):
+    def _conf(self, title: str = "垃圾袋ID:", color: str = "#b69968", support_del_all: bool = True):
         self.frame_title = title
         self.frame_color = color
         self.support_del_all = support_del_all
@@ -877,7 +869,7 @@ class DeleteGarbageProgramBase(AdminProgram):
         for i in range(4):
             radio = self.radio[i]
             radio['font'] = btn_font
-            radio['text'] = ['From-All', 'From-NotUse', 'From-Waiting', 'From-Used'][i]
+            radio['text'] = ['均可', '仅未使用', '仅待检测', '仅已检测'][i]
             radio['bg'] = self.color
             radio['value'] = i
             radio['variable'] = self.int_var
@@ -893,7 +885,7 @@ class DeleteGarbageProgramBase(AdminProgram):
         self.radio[3].place(relx=0.60, rely=0.55, relwidth=0.20, relheight=0.1)
 
         self.btn['font'] = btn_font
-        self.btn['text'] = 'Delete'
+        self.btn['text'] = '删除'
         self.btn['bg'] = conf.tk_btn_bg
         self.btn['command'] = lambda: self.delete_garbage()
         self.btn.place(relx=0.4, rely=0.68, relwidth=0.2, relheight=0.08)
@@ -912,7 +904,7 @@ class DeleteGarbageProgramBase(AdminProgram):
 
 class DeleteGarbageProgram(DeleteGarbageProgramBase):
     def __init__(self, station, win, color):
-        super(DeleteGarbageProgram, self).__init__(station, win, color, "DeleteGarbage")
+        super(DeleteGarbageProgram, self).__init__(station, win, color, "删除垃圾袋")
 
     def delete_garbage(self):
         where = self.int_var.get()
@@ -920,7 +912,7 @@ class DeleteGarbageProgram(DeleteGarbageProgramBase):
 
         gid = self.var.get()
         if len(gid) == 0:
-            self.station.show_msg("GarbageID Error", "You should enter the garbage id", "Warning")
+            self.station.show_warning("垃圾袋ID错误", "请输入正确的垃圾袋ID")
             return
 
         event = tk_event.DelGarbageEvent(self.station).start(gid, where)
@@ -929,9 +921,9 @@ class DeleteGarbageProgram(DeleteGarbageProgramBase):
 
 class DeleteGarbageMoreProgram(DeleteGarbageProgramBase):
     def __init__(self, station, win, color):
-        super(DeleteGarbageMoreProgram, self).__init__(station, win, color, "DeleteGarbageMore")
+        super(DeleteGarbageMoreProgram, self).__init__(station, win, color, "删除多个垃圾袋")
         self.scan_btn = tk.Button(self.frame)
-        self._conf("Where:", "#f58f98", False)
+        self._conf("条件:", "#f58f98", False)
 
     def conf_gui(self, n: int = 1):
         super(DeleteGarbageMoreProgram, self).conf_gui(n)
@@ -939,9 +931,9 @@ class DeleteGarbageMoreProgram(DeleteGarbageProgramBase):
         self.btn.place(relx=0.2, rely=0.68, relwidth=0.2, relheight=0.08)
 
         self.scan_btn['font'] = make_font(size=self.btn_font_size)
-        self.scan_btn['text'] = 'Scan'
+        self.scan_btn['text'] = '扫描'
         self.scan_btn['bg'] = conf.tk_btn_bg
-        self.scan_btn['command'] = lambda: self.delete_garbage(True)
+        self.scan_btn['command'] = self.scan_garbage
         self.scan_btn.place(relx=0.6, rely=0.68, relwidth=0.2, relheight=0.08)
 
     def set_disable(self):
@@ -952,25 +944,34 @@ class DeleteGarbageMoreProgram(DeleteGarbageProgramBase):
         super(DeleteGarbageMoreProgram, self).reset_disable()
         self.scan_btn['state'] = 'normal'
 
-    def delete_garbage(self, is_scan: bool = False):
+    def delete_garbage(self):
         where = self.int_var.get()
         assert where in [1, 2, 3]
 
         where_sql = self.var.get()
         if len(where_sql) == 0:
-            self.station.show_msg("`Where`Error", "`Where` must be SQL", "Warning")
+            self.station.show_warning("条件错误", "条件必须为正确的SQL语句")
             return
 
-        if is_scan:
-            event = tk_event.DelGarbageWhereScanEvent(self.station).start(where, where_sql)
-        else:
-            event = tk_event.DelGarbageWhereEvent(self.station).start(where, where_sql)
+        event = tk_event.DelGarbageWhereEvent(self.station).start(where, where_sql)
+        self.station.push_event(event)
+
+    def scan_garbage(self):
+        where = self.int_var.get()
+        assert where in [1, 2, 3]
+
+        where_sql = self.var.get()
+        if len(where_sql) == 0:
+            self.station.show_warning("条件错误", "条件必须为正确的SQL语句")
+            return
+
+        event = tk_event.DelGarbageWhereScanEvent(self.station).start(where, where_sql)
         self.station.push_event(event)
 
 
 class DeleteAllGarbageProgram(AdminProgram):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "DeleteAllGarbage")
+        super().__init__(station, win, color, "删除所有垃圾袋")
 
         self.dangerous: tk.Label = tk.Label(self.frame)
 
@@ -999,22 +1000,24 @@ class DeleteAllGarbageProgram(AdminProgram):
         self.dangerous['bg'] = self.color
         self.dangerous['font'] = danger_font
         self.dangerous['fg'] = "#f20c00"
-        self.dangerous['text'] = ("Delete all garbage from database?\n"
-                                  "Please enter the admin-passwd to\n"
-                                  "continue.\n"
-                                  "Dangerous operation.\n"
-                                  "The database may not be restored.\n"
-                                  "SuperHuan is not responsible for\n"
-                                  "the consequences.")
-        self.dangerous.place(relx=0.05, rely=0.03, relwidth=0.9, relheight=0.43)
+        self.dangerous['text'] = ("确定要从数据库删除所有垃圾袋吗?\n"
+                                  "请输入[admin]用户的密码再继续操作.\n"
+                                  "只有[admin]用户具有该操作的权限.\n"
+                                  "这是相当危险的操作.\n"
+                                  "操作后数据库可能无法恢复原数据.\n"
+                                  "SuperHuan和程序的缔造者不会对\n"
+                                  "此操作负责.\n"
+                                  "删库跑路可不是一件好事.\n"
+                                  "请遵守当地法律法规.")
+        self.dangerous.place(relx=0.05, rely=0.03, relwidth=0.9, relheight=0.53)
 
         self.enter_frame['bg'] = "#f20c00"
         self.enter_frame['bd'] = 5
         self.enter_frame['relief'] = "ridge"
-        self.enter_frame.place(relx=0.2, rely=0.50, relwidth=0.6, relheight=0.10)
+        self.enter_frame.place(relx=0.2, rely=0.60, relwidth=0.6, relheight=0.10)
 
         self.title['font'] = title_font
-        self.title['text'] = "Password:"
+        self.title['text'] = "密码:"
         self.title['bg'] = "#f20c00"
         self.title['anchor'] = 'e'
 
@@ -1024,9 +1027,9 @@ class DeleteAllGarbageProgram(AdminProgram):
         self.title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
         self.enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
 
-        for btn, text, x in zip(self.btn, ["Delete", "Scan"], [0.2, 0.6]):
+        for btn, text, x in zip(self.btn, ["删除", "扫描"], [0.2, 0.6]):
             btn['text'] = text
-            btn.place(relx=x, rely=0.68, relwidth=0.2, relheight=0.08)
+            btn.place(relx=x, rely=0.78, relwidth=0.2, relheight=0.08)
 
         self.btn[0]['font'] = danger_btn_font
         self.btn[0]['bg'] = "#f20c00"
@@ -1043,11 +1046,11 @@ class DeleteAllGarbageProgram(AdminProgram):
     def delete_garbage(self):
         passwd = self.var.get()
         if len(passwd) == 0:
-            self.station.show_msg("PassWordError", "Password error", "Warning")
+            self.station.show_warning("密码错误", "请输入正确的[admin]用户密码")
 
         user = find_user_by_name('admin', passwd, self.station.get_db())
         if user is None or not user.is_manager():
-            self.station.show_msg("PassWordError", "Password error", "Warning")
+            self.station.show_warning("密码错误", "请输入正确的[admin]用户密码")
             return
 
         event = tk_event.DelAllGarbageEvent(self.station)  # 不需要start
@@ -1062,7 +1065,7 @@ class DeleteAllGarbageProgram(AdminProgram):
         self.enter['state'] = 'normal'
 
 
-class SearchBaseProgram(AdminProgram, metaclass=abc.ABCMeta):
+class SearchProgramBase(AdminProgram, metaclass=abc.ABCMeta):
     def __init__(self, station, win, color, title: str):
         super().__init__(station, win, color, title)
         self.view_frame = tk.Frame(self.frame)
@@ -1098,9 +1101,9 @@ class SearchBaseProgram(AdminProgram, metaclass=abc.ABCMeta):
         self.x_scroll.place(relx=0.0, rely=1 - x_scroll, relwidth=1 - y_scroll, relheight=x_scroll)
 
 
-class SearchUserProgram(SearchBaseProgram):
+class SearchUserProgram(SearchProgramBase):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "SearchUser")
+        super().__init__(station, win, color, "搜索用户")
 
         self.enter_frame = tk.Frame(self.frame)
         self.title: List[tk.Label] = [tk.Label(self.enter_frame) for _ in range(3)]
@@ -1110,6 +1113,8 @@ class SearchUserProgram(SearchBaseProgram):
                                                                 for _ in range(3)]
         self.btn: tk.Button = tk.Button(self.frame)
         self._columns = ["UserID", "Name", "Phone", "Score", "Reputation", "IsManager"]
+        self._columns_ch = ["用户ID[UserID]", "用户名[Name]", "手机号[Phone]",
+                            "积分[Score]", "垃圾分类信用[Reputation]", "是否管理员[IsManager]"]
         self.__conf_font()
 
     def __conf_font(self, n: int = 1):
@@ -1129,7 +1134,7 @@ class SearchUserProgram(SearchBaseProgram):
 
         height = 0.1
         for lb, text, enter, var, check in zip(self.title,
-                                               ["UserID:", "UserName:", "Phone:"],
+                                               ["用户ID:", "用户名:", "手机号:"],
                                                self.enter, self.var, self.check):
             lb['font'] = title_font
             lb['text'] = text
@@ -1151,12 +1156,12 @@ class SearchUserProgram(SearchBaseProgram):
             height += 0.30
 
         self.btn['font'] = btn_font
-        self.btn['text'] = "Search"
+        self.btn['text'] = "搜索"
         self.btn['bg'] = conf.tk_btn_bg
         self.btn['command'] = self.search_user
         self.btn.place(relx=0.4, rely=0.9, relwidth=0.2, relheight=0.08)
 
-        self.conf_view_gui(self._columns, relx=0.05, rely=0.32, relwidth=0.9, relheight=0.55)
+        self.conf_view_gui(self._columns_ch, relx=0.05, rely=0.32, relwidth=0.9, relheight=0.55)
 
     def search_user(self):
         use_uid = self.check[0][1].get()
@@ -1192,7 +1197,7 @@ class SearchUserProgram(SearchBaseProgram):
         set_tk_disable_from_list(self.enter, flat='normal')
 
 
-class SearchAdvancedProgramBase(SearchBaseProgram, metaclass=abc.ABCMeta):
+class SearchAdvancedProgramBase(SearchProgramBase, metaclass=abc.ABCMeta):
     def __init__(self, station, win, color, title: str):
         super().__init__(station, win, color, title)
 
@@ -1202,12 +1207,13 @@ class SearchAdvancedProgramBase(SearchBaseProgram, metaclass=abc.ABCMeta):
         self.var: tk.Variable = tk.StringVar()
 
         self.btn: tk.Button = tk.Button(self.frame)
-        self._conf([], "#FA8072")  # 默认颜色
+        self._conf([], [], "#FA8072")  # 默认颜色
         self.__conf_font()
 
-    def _conf(self, columns: list, bg_color):
+    def _conf(self, columns: list, columns_ch: list, bg_color):
         self.bg_color = bg_color
         self._columns = columns
+        self._columns_ch = columns_ch
         return self
 
     def __conf_font(self, n: int = 1):
@@ -1227,7 +1233,7 @@ class SearchAdvancedProgramBase(SearchBaseProgram, metaclass=abc.ABCMeta):
 
         self.title['font'] = title_font
         self.title['bg'] = self.bg_color
-        self.title['text'] = "Where:"
+        self.title['text'] = "条件:"
         self.title['anchor'] = 'e'
 
         self.enter['font'] = title_font
@@ -1236,13 +1242,13 @@ class SearchAdvancedProgramBase(SearchBaseProgram, metaclass=abc.ABCMeta):
         self.title.place(relx=0.01, rely=0.25, relwidth=0.30, relheight=0.50)
         self.enter.place(relx=0.35, rely=0.25, relwidth=0.60, relheight=0.50)
 
-        self.btn['text'] = "Search"
+        self.btn['text'] = "搜索"
         self.btn['font'] = btn_font
         self.btn['bg'] = conf.tk_btn_bg
         self.btn['command'] = self.search
         self.btn.place(relx=0.4, rely=0.9, relwidth=0.2, relheight=0.08)
 
-        self.conf_view_gui(self._columns, relx=0.05, rely=0.12, relwidth=0.9, relheight=0.76)
+        self.conf_view_gui(self._columns_ch, relx=0.05, rely=0.12, relwidth=0.9, relheight=0.76)
 
     def search(self):
         ...
@@ -1258,9 +1264,11 @@ class SearchAdvancedProgramBase(SearchBaseProgram, metaclass=abc.ABCMeta):
 
 class SearchUserAdvancedProgram(SearchAdvancedProgramBase):
     def __init__(self, station, win, color):
-        super(SearchUserAdvancedProgram, self).__init__(station, win, color, "SearchUserAdvanced")
+        super(SearchUserAdvancedProgram, self).__init__(station, win, color, "高级搜索-用户")
         columns = ["UserID", "Name", "Phone", "Score", "Reputation", "IsManager"]
-        self._conf(columns, '#48c0a3')
+        columns_ch = ["用户ID[UserID]", "用户名[Name]", "手机号[Phone]",
+                      "积分[Score]", "垃圾分类信用[Reputation]", "是否管理员[IsManager]"]
+        self._conf(columns, columns_ch, '#48c0a3')
 
     def search(self):
         where = self.var.get()
@@ -1268,9 +1276,9 @@ class SearchUserAdvancedProgram(SearchAdvancedProgramBase):
         self.station.push_event(event)
 
 
-class SearchGarbageProgram(SearchBaseProgram):
+class SearchGarbageProgram(SearchProgramBase):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "SearchGarbage")
+        super().__init__(station, win, color, "搜索垃圾袋")
 
         self.enter_frame = tk.Frame(self.frame)
         self.title: List[tk.Label] = [tk.Label(self.enter_frame) for _ in range(8)]
@@ -1280,6 +1288,8 @@ class SearchGarbageProgram(SearchBaseProgram):
                                                                 for _ in range(8)]
         self._columns = ["GarbageID", "UserID", "CheckerID", "CreateTime", "UseTime", "Location", "GarbageType",
                          "CheckResult"]
+        self._columns_zh = ["垃圾袋ID[GarbageID]", "使用者ID[UserID]", "检测者ID[CheckerID]", "创建时间[CreateTime]",
+                            "使用时间[UseTime]", "使用地点[Location]", "垃圾类型[GarbageType]", "检测结果[CheckResult]"]
         self.btn: tk.Button = tk.Button(self.frame)
         self.__conf_font()
 
@@ -1300,8 +1310,8 @@ class SearchGarbageProgram(SearchBaseProgram):
 
         height = 0.02
         for lb, text, enter, var, check in zip(self.title,
-                                               ["GarbageID:", "UserID:", "CheckerID:", "CreateTime:", "UseTime:",
-                                                "Location:", "GarbageType:", "CheckResult:"],
+                                               ["垃圾袋ID:", "使用者ID:", "检查者ID:", "创建时间:", "使用时间:",
+                                                "使用地点:", "垃圾类型:", "检测结果:"],
                                                self.enter, self.var, self.check):
             lb['font'] = title_font
             lb['text'] = text
@@ -1328,7 +1338,7 @@ class SearchGarbageProgram(SearchBaseProgram):
         self.btn['command'] = self.search_user
         self.btn.place(relx=0.4, rely=0.9, relwidth=0.2, relheight=0.08)
 
-        self.conf_view_gui(self._columns, relx=0.05, rely=0.49, relwidth=0.9, relheight=0.38, x_scroll=0.07)
+        self.conf_view_gui(self._columns_zh, relx=0.05, rely=0.49, relwidth=0.9, relheight=0.38, x_scroll=0.07)
 
     def search_user(self):
         keys = ["gid", "uid", "cuid", "create_time", "use_time", "loc", "type_", "check"]
@@ -1356,10 +1366,12 @@ class SearchGarbageProgram(SearchBaseProgram):
 
 class SearchGarbageAdvancedProgram(SearchAdvancedProgramBase):
     def __init__(self, station, win, color):
-        super(SearchGarbageAdvancedProgram, self).__init__(station, win, color, "SearchGarbageAdvanced")
+        super(SearchGarbageAdvancedProgram, self).__init__(station, win, color, "高级搜索-垃圾袋")
         columns = ["GarbageID", "UserID", "CheckerID", "CreateTime", "UseTime", "Location", "GarbageType",
                    "CheckResult"]
-        self._conf(columns, '#d1923f')
+        columns_zh = ["垃圾袋ID[GarbageID]", "使用者ID[UserID]", "检测者ID[CheckerID]", "创建时间[CreateTime]",
+                      "使用时间[UseTime]", "使用地点[Location]", "垃圾类型[GarbageType]", "检测结果[CheckResult]"]
+        self._conf(columns, columns_zh, '#d1923f')
 
     def search(self):
         where = self.var.get()
@@ -1369,11 +1381,15 @@ class SearchGarbageAdvancedProgram(SearchAdvancedProgramBase):
 
 class SearchAdvancedProgram(SearchAdvancedProgramBase):
     def __init__(self, station, win, color):
-        super(SearchAdvancedProgram, self).__init__(station, win, color, "SearchAdvanced")
+        super(SearchAdvancedProgram, self).__init__(station, win, color, "高级搜索")
         columns = ["GarbageID", "UserID", "UserName", "UserPhone", "UserScore",
                    "UserReputation", "CheckerID", "CheckerName", "CheckerPhone",
                    "CreateTime", "UseTime", "Location", "GarbageType", "CheckResult"]
-        self._conf(columns, '#426ab3')
+        columns_zh = ["垃圾袋ID[GarbageID]", "使用者ID[UserID]", "使用者名[UserName]", "使用者手机号[UserPhone]",
+                      "使用者积分[UserScore]", "使用者垃圾分类信用[UserReputation]", "检测者ID[CheckerID]",
+                      "检测这名[CheckerName]", "检测者手机号[CheckerPhone]", "创建时间[CreateTime]", "使用时间[UseTime]",
+                      "使用地点[Location]", "垃圾类型[GarbageType]", "检测结果[CheckResult]"]
+        self._conf(columns, columns_zh, '#426ab3')
 
     def search(self):
         where = self.var.get()
@@ -1427,7 +1443,7 @@ class UpdateUserProgramBase(AdminProgram):
         height = 0.1
         for lb, text, enter, var, lb_w, text_w, enter_w, var_w in (
                 zip(self.title, self.enter_title, self.enter, self.var,
-                    self.where_title, ["Where:", self.enter_title[1]], self.where_enter, self.where_var)):
+                    self.where_title, ["条件:", self.enter_title[1]], self.where_enter, self.where_var)):
             lb['font'] = title_font
             lb['text'] = text
             lb['bg'] = self.bg_color
@@ -1452,7 +1468,7 @@ class UpdateUserProgramBase(AdminProgram):
             height += 0.43
 
         for btn, text, func in zip(self.btn,
-                                   ["Update Advanced", "Update By UserID"],
+                                   ["通过条件更新", "通过用户ID更新"],
                                    [self.update_by_where, self.update_by_uid]):
             btn['font'] = btn_font
             btn['text'] = text
@@ -1479,8 +1495,8 @@ class UpdateUserProgramBase(AdminProgram):
 
 class UpdateUserScoreBase(UpdateUserProgramBase):
     def __init__(self, station, win, color):
-        super(UpdateUserScoreBase, self).__init__(station, win, color, "UpdateScore")
-        self._conf(["UserID:", "Score:"], "#afdfe4")
+        super(UpdateUserScoreBase, self).__init__(station, win, color, "更新用户-积分")
+        self._conf(["用户ID:", "积分:"], "#afdfe4")
 
     def update_by_uid(self):
         uid = self.enter[0].get()
@@ -1497,8 +1513,8 @@ class UpdateUserScoreBase(UpdateUserProgramBase):
 
 class UpdateUserReputationBase(UpdateUserProgramBase):
     def __init__(self, station, win, color):
-        super(UpdateUserReputationBase, self).__init__(station, win, color, "UpdateReputation")
-        self._conf(["UserID:", "Reputation:"], "#f8aba6")
+        super(UpdateUserReputationBase, self).__init__(station, win, color, "更新用户-垃圾分类信用")
+        self._conf(["用户ID:", "垃圾分类信用:"], "#f8aba6")
 
     def update_by_uid(self):
         uid = self.enter[0].get()
@@ -1515,7 +1531,7 @@ class UpdateUserReputationBase(UpdateUserProgramBase):
 
 class UpdateGarbageTypeProgram(AdminProgram):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "UpdateGarbageType")
+        super().__init__(station, win, color, "更新垃圾袋-垃圾类型")
 
         self.enter_frame = tk.Frame(self.frame)
         self.title: tk.Label = tk.Label(self.enter_frame)
@@ -1557,7 +1573,7 @@ class UpdateGarbageTypeProgram(AdminProgram):
                                                    [self.type, self.where_type],
                                                    [self.var, self.where_var],
                                                    [0.32, 0.72],
-                                                   ["GarbageID:", "Where:"]):
+                                                   ["垃圾袋ID:", "条件:"]):
             lb['font'] = title_font
             lb['text'] = text
             lb['bg'] = "#fdb933"
@@ -1569,7 +1585,7 @@ class UpdateGarbageTypeProgram(AdminProgram):
             for i, radio in enumerate(radios):
                 radio['font'] = btn_font
                 radio['bg'] = self.color
-                radio['text'] = GarbageType.GarbageTypeStrList[i + 1]
+                radio['text'] = GarbageType.GarbageTypeStrList_ch[i + 1]
                 radio['value'] = i + 1
                 radio['variable'] = var[1]
                 radio['anchor'] = 'w'
@@ -1584,7 +1600,7 @@ class UpdateGarbageTypeProgram(AdminProgram):
             enter.place(relx=0.30, rely=0.2, relwidth=0.60, relheight=0.48)
 
         for btn, text, func in zip(self.btn,
-                                   ["Update Advanced", "Update By GarbageID"],
+                                   ["通过条件更新", "通过垃圾袋ID更新"],
                                    [self.update_by_where, self.update_by_gid]):
             btn['font'] = btn_font
             btn['text'] = text
@@ -1619,7 +1635,7 @@ class UpdateGarbageTypeProgram(AdminProgram):
 
 class UpdateGarbageCheckResultProgram(AdminProgram):
     def __init__(self, station, win, color):
-        super().__init__(station, win, color, "UpdateGarbageCheckResult")
+        super().__init__(station, win, color, "更新垃圾袋-检测结果")
 
         self.enter_frame = tk.Frame(self.frame)
         self.title: tk.Label = tk.Label(self.enter_frame)
@@ -1661,7 +1677,7 @@ class UpdateGarbageCheckResultProgram(AdminProgram):
                                                    [self.type, self.where_type],
                                                    [self.var, self.where_var],
                                                    [0.32, 0.72],
-                                                   ["GarbageID:", "Where:"]):
+                                                   ["垃圾袋ID:", "条件:"]):
             lb['font'] = title_font
             lb['text'] = text
             lb['bg'] = "#abc88b"
@@ -1673,7 +1689,7 @@ class UpdateGarbageCheckResultProgram(AdminProgram):
             for i, radio in enumerate(radios):
                 radio['font'] = btn_font
                 radio['bg'] = self.color
-                radio['text'] = ["Fail", "Pass"][i]
+                radio['text'] = ["投放错误", "投放正确"][i]
                 radio['value'] = i
                 radio['variable'] = var[1]
                 radio['anchor'] = 'w'
@@ -1686,7 +1702,7 @@ class UpdateGarbageCheckResultProgram(AdminProgram):
             enter.place(relx=0.30, rely=0.2, relwidth=0.60, relheight=0.48)
 
         for btn, text, func in zip(self.btn,
-                                   ["Update Advanced", "Update By GarbageID"],
+                                   ["通过条件更新", "通过垃圾袋ID更新"],
                                    [self.update_by_where, self.update_by_gid]):
             btn['font'] = btn_font
             btn['bg'] = conf.tk_btn_bg

+ 30 - 9
control/event.py

@@ -11,34 +11,42 @@ class TkEventException(Exception):
 
 
 class TkEventBase(metaclass=abc.ABCMeta):
+    """
+    Tkinter 子线程任务
+    """
+
     def __init__(self):
-        self.thread: Optional[TkThreading] = None
+        self.thread: Optional[TkThreading] = None  # 子线程
 
-    def is_end(self) -> bool:
+    def is_end(self) -> bool:  # 判断子线程是否结束
         if self.thread is not None and not self.thread.is_alive():
             return True
         return False
 
     @abc.abstractmethod
-    def get_title(self) -> str:
+    def get_title(self) -> str:  # 获取任务名字
         ...
 
-    def done_after_event(self):
+    def done_after_event(self):  # 子线程结束后, 在GUI线程执行的代码
         if self.thread is not None:
             self.thread.wait_event()
 
 
 class TkEventMain(metaclass=abc.ABCMeta):
+    """
+    Tkinter 处理子线程基类
+    """
+
     def __init__(self):
         self._event_list: List[TkEventBase] = []
         self.set_after_run(conf.tk_refresh_delay, lambda: self.run_event())
 
-    def push_event(self, event: TkEventBase):
+    def push_event(self, event: TkEventBase):  # 添加子线程
         self._event_list.append(event)
         self.show_loading(event.get_title())
         self.run_event()
 
-    def run_event(self):
+    def run_event(self):  # 定时任务, 检测子线程是否结束, 并运行 done_after_event
         if len(self._event_list) == 0:
             return
 
@@ -61,11 +69,11 @@ class TkEventMain(metaclass=abc.ABCMeta):
         self.set_after_run_now(conf.tk_refresh_delay, self.run_event)
 
     @abc.abstractmethod
-    def show_loading(self, title: str):
+    def show_loading(self, title: str):  # 有子线程时显示加载
         ...
 
     @abc.abstractmethod
-    def stop_loading(self):
+    def stop_loading(self):  # 子线程运行完成后关闭加载
         ...
 
     @abc.abstractmethod
@@ -78,7 +86,16 @@ class TkEventMain(metaclass=abc.ABCMeta):
 
 
 class TkThreading(threading.Thread):
+    """
+    tkinter 子线程
+    """
+
     def __init__(self, func, *args, start_now: bool = True):
+        """
+        :param func: 子线程函数
+        :param args: 子线程参数
+        :param start_now: 是否马上运行 (否则要回调.start函数)
+        """
         threading.Thread.__init__(self)
         self.func = func
         self.args = args
@@ -95,6 +112,10 @@ class TkThreading(threading.Thread):
         finally:
             del self.func, self.args
 
-    def wait_event(self):
+    def wait_event(self) -> any:
+        """
+        等待线程结束
+        :return: 线程函数的返回值
+        """
         self.join()
         return self.result

+ 2 - 2
control/ranking.py

@@ -311,11 +311,11 @@ class RankingStation(RankingStationBase):
 
         self.rank_frame['relief'] = "ridge"
         self.rank_frame['bd'] = 5
-        self.rank_frame['bg'] = conf.tk_win_bg
+        self.rank_frame['bg'] = conf.tk_second_win_bg
         self.rank_frame.place(relx=relx, rely=rely, relwidth=relwidth, relheight=relheight)
 
         self.rank_title['font'] = title_font
-        self.rank_title['bg'] = conf.tk_win_bg
+        self.rank_title['bg'] = conf.tk_second_win_bg
         self.rank_title['textvariable'] = self.rank_title_var
         self.rank_title.place(relx=0.02, rely=0.00, relwidth=0.96, relheight=0.1)
         self.rank_title_var.set("排行榜加载中...")

+ 12 - 4
control/station.py

@@ -48,6 +48,7 @@ class GarbageStationBase(TkEventMain, metaclass=abc.ABCMeta):
     """
     GarbageStation基类
     封装GarbageStation的相关操作
+    主要是柯里化 QR, sql相关函数
     """
 
     # 操作状态
@@ -147,28 +148,35 @@ class GarbageStationBase(TkEventMain, metaclass=abc.ABCMeta):
         if self._user is not None and self._user.get_uid() == user.get_uid() and self.check_user():  # 正在登陆期
             self._user = None  # 退出登录
             self._user_last_time = 0
+            self.show_msg("退出登录", "退出登录成功", show_time=3.0)
             return False
         self._user = user
         self._user_last_time = time.time()
+        self.show_msg("登录", "登录成功", show_time=3.0)
         return True  # 登录
 
     def throw_garbage_core(self, garbage: GarbageBag, garbage_type: enum):
         self.__check_normal_user()
         if not self._user.throw_rubbish(garbage, garbage_type, self._loc):
+            self.show_warning("垃圾投放", "垃圾投放失败", show_time=3.0)
             raise ThrowGarbageError
         update_garbage(garbage, self._db)
         update_user(self._user, self._db)
+        self.show_msg("垃圾投放", "垃圾投放成功", show_time=3.0)
 
     def check_garbage_core(self, garbage: GarbageBag, check_result: bool):
         self.__check_manager_user()
         user = find_user_by_id(garbage.get_user(), self._db)
         if user is None:
+            self.show_warning("垃圾检测", "垃圾袋还未使用", show_time=3.0)
             raise GarbageBagNotUse
         if not self._user.check_rubbish(garbage, check_result, user):
+            self.show_warning("垃圾检测", "垃圾检测提结果交失败", show_time=3.0)
             raise CheckGarbageError
         update_garbage(garbage, self._db)
         update_user(self._user, self._db)
         update_user(user, self._db)
+        self.show_msg("垃圾检测", "垃圾检测提结果交成功", show_time=3.0)
 
     def ranking(self, limit: int = 0, order_by: str = 'DESC') -> list[Tuple[uid_t, uname_t, score_t, score_t]]:
         """
@@ -679,7 +687,7 @@ class GarbageStation(GarbageStationBase):
     def __conf_title_label(self):
         title_font = make_font(size=self._title_font_size, weight="bold")
         self._title_label['font'] = title_font
-        self._title_label['bg'] = conf.tk_win_bg  # 蜜瓜绿
+        self._title_label['bg'] = conf.tk_win_bg
         self._title_label['text'] = "HGSSystem: Garbage Station Control Center"  # 使用英语标题在GUI更美观
         self._title_label['anchor'] = 'w'
         self._title_label.place(relx=0.02, rely=0.01, relwidth=0.7, relheight=0.07)
@@ -890,7 +898,7 @@ class GarbageStation(GarbageStationBase):
         title_font = make_font(size=self._msg_font_size + 1, weight="bold")
         info_font = make_font(size=self._msg_font_size - 1)
 
-        bg_color = "#F5FFFA"
+        bg_color = conf.tk_second_win_bg
         self._msg_frame['bg'] = bg_color
         self._msg_frame['bd'] = 5
         self._msg_frame['relief'] = "ridge"
@@ -1077,13 +1085,13 @@ class GarbageStation(GarbageStationBase):
     def __conf_loading(self):
         title_font = make_font(size=self._loading_tile_font, weight="bold")
 
-        self._loading_frame['bg'] = conf.tk_win_bg
+        self._loading_frame['bg'] = conf.tk_second_win_bg
         self._loading_frame['bd'] = 5
         self._loading_frame['relief'] = "ridge"
         # frame 不会立即显示
 
         self._loading_title[0]['font'] = title_font
-        self._loading_title[0]['bg'] = conf.tk_win_bg
+        self._loading_title[0]['bg'] = conf.tk_second_win_bg
         self._loading_title[0]['anchor'] = 'w'
         self._loading_title[0]['textvariable'] = self._loading_title[1]
         self._loading_title[0].place(relx=0.02, rely=0.00, relwidth=0.96, relheight=0.6)

+ 21 - 0
control/station_event.py

@@ -25,6 +25,11 @@ class StationEventBase(TkEventBase):
 
 
 class ScanUserEvent(StationEventBase):
+    """
+    任务: 扫码用户, 访问db获取数据
+    若QR-CODE不是User码则调用ScanGarbage任务
+    """
+
     @staticmethod
     def func(qr: QRCode, db: DB):
         return scan_user(qr, db)
@@ -55,6 +60,10 @@ class ScanUserEvent(StationEventBase):
 
 
 class ScanGarbageEvent(StationEventBase):
+    """
+    任务: 扫码垃圾袋, 访问db获取数据
+    """
+
     @staticmethod
     def func(qr: QRCode, db: DB):
         return scan_garbage(qr, db)
@@ -90,6 +99,10 @@ class ScanGarbageEvent(StationEventBase):
 
 
 class RankingEvent(StationEventBase):
+    """
+    任务: 获取排行榜数据
+    """
+
     @staticmethod
     def func(db: DB):
         cur = db.search((f"SELECT UserID, Name, Score, Reputation "
@@ -117,6 +130,10 @@ class RankingEvent(StationEventBase):
 
 
 class ThrowGarbageEvent(StationEventBase):
+    """
+    任务: 提交扔垃圾的结果
+    """
+
     def func(self, garbage: GarbageBag, garbage_type: enum):
         try:
             self.station.throw_garbage_core(garbage, garbage_type)
@@ -145,6 +162,10 @@ class ThrowGarbageEvent(StationEventBase):
 
 
 class CheckGarbageEvent(StationEventBase):
+    """
+    任务: 提交检测垃圾的结果
+    """
+
     def func(self, garbage: GarbageBag, check: bool):
         try:
             self.station.check_garbage_core(garbage, check)