Переглянути джерело

feat: 排行榜系统汉化

SongZihuan 3 роки тому
батько
коміт
db561c3371
3 змінених файлів з 67 додано та 24 видалено
  1. 50 12
      control/ranking.py
  2. 7 0
      control/station.py
  3. 10 12
      control/station_event.py

+ 50 - 12
control/ranking.py

@@ -21,6 +21,11 @@ class RankingPageError(RankingStationException):
 
 
 class RankingStationBase(metaclass=abc.ABCMeta):
+    """
+    RankingStation基类
+    封装排行榜相关操作
+    """
+
     def __init__(self, db: DB):
         self._db = db
         self.rank = [[]]
@@ -29,13 +34,18 @@ class RankingStationBase(metaclass=abc.ABCMeta):
         self.rank_count = 1
 
         self.offset = 0
-        self.limit_n = 2
+        self.limit_n = 2  # 一次性获取的数据 (页数, 行数=limit_n * rank_count)
 
         self.auto: bool = False
         self.auto_to_next: bool = True  # auto的移动方向
         self.auto_time: int = 5000  # 5s
 
     def get_rank(self, offset: int = 0) -> Tuple[bool, list]:
+        """
+        获取数据
+        :param offset: 位移 (相对于当前位置移动的页数)
+        :return: 成功, 排行榜数据
+        """
         limit = self.rank_count * self.limit_n
         offset = self.offset + limit * offset  # offset为0表示不移动, 1表示向前, -1表示向后
         cur = self._db.search((f"SELECT UserID, Name, Score, Reputation "
@@ -65,6 +75,10 @@ class RankingStationBase(metaclass=abc.ABCMeta):
         return True, rank
 
     def rank_page_to_next(self):
+        """
+        显示排行榜下一页数据
+        :return:
+        """
         if self.rank_index == len(self.rank) - 1:
             self.set_next_btn(True)  # 当 rank_index为最后一项时, 该函数不应该被调用(除非数据库被外部改动)
             return
@@ -87,6 +101,10 @@ class RankingStationBase(metaclass=abc.ABCMeta):
             self.set_run_after_now(self.auto_time, self.update_rank_auto)
 
     def rank_page_to_prev(self):
+        """
+        显示排行榜上一页数据
+        :return:
+        """
         if self.rank_index == 0:  # 当 rank_index为最后一项时, 该函数不应该被调用(除非数据库被外部改动)
             self.set_prev_btn(True)
             return
@@ -106,6 +124,10 @@ class RankingStationBase(metaclass=abc.ABCMeta):
             self.set_run_after_now(self.auto_time, self.update_rank_auto)
 
     def show_rank_first(self):
+        """
+        第一次显示排行榜数据
+        :return:
+        """
         self.rank_index = 0
         self.offset = 0
         self.rank_count = self.rank_count
@@ -120,6 +142,11 @@ class RankingStationBase(metaclass=abc.ABCMeta):
             self.set_next_btn(False)
 
     def rank_auto(self, auto):
+        """
+        启用或关闭自动显示
+        :param auto: True-启用自动显示, False-关闭
+        :return:
+        """
         if auto:
             self.auto = True
             self.disable_btn()
@@ -129,6 +156,10 @@ class RankingStationBase(metaclass=abc.ABCMeta):
             self.able_btn()
 
     def update_rank_auto(self):
+        """
+        自动显示
+        :return:
+        """
         if not self.auto:
             return
 
@@ -181,6 +212,12 @@ class RankingStationBase(metaclass=abc.ABCMeta):
 
 
 class RankingStation(RankingStationBase):
+    """
+        RankingStation 排行榜系统
+        使用tkinter作为GUI
+        派生自 GarbageStation
+        """
+
     def __init__(self, db: DB):
         self.init_after_run_list: List[Tuple[int, Callable, Tuple]] = []
         super(RankingStation, self).__init__(db)
@@ -194,7 +231,7 @@ class RankingStation(RankingStationBase):
         self._full_screen = False
         self.__conf_windows()
 
-        self.next_btn: bool = True  # 表示开关是否启用
+        self.next_btn: bool = True  # 表示按键是否启用
         self.prev_btn: bool = True
 
         self.__conf_font_size()
@@ -207,7 +244,7 @@ class RankingStation(RankingStationBase):
         self.rank_frame = tk.Frame(self.window)
         self.rank_title = tk.Label(self.rank_frame)
         self.rank_title_var = tk.StringVar()
-        self.rank_count = 7
+        self.rank_count = 7  # 一页显示的行数
         self.rank_label = [tk.Label(self.rank_frame) for _ in range(self.rank_count)]
         self.rank_y_height: List[Tuple[float, float]] = []  # rank 标签的y坐标信息
         self.rank_var = [tk.StringVar() for _ in range(self.rank_count)]
@@ -216,7 +253,7 @@ class RankingStation(RankingStationBase):
     def __conf_font_size(self, n: Union[int, float] = 1):
         self._rank_font_title_size = int(24 * n)
         self._rank_font_size = int(16 * n)
-        self._rank_font_btn_size = int(20 * n)
+        self._rank_font_btn_size = int(16 * n)
 
     def __conf_tk(self):
         self.__conf_windows_bg()
@@ -281,7 +318,7 @@ class RankingStation(RankingStationBase):
         self.rank_title['bg'] = conf.tk_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("Ranking.loading...")
+        self.rank_title_var.set("排行榜加载中...")
 
         """
         标签所拥有的总高度为0.82
@@ -310,10 +347,10 @@ class RankingStation(RankingStationBase):
             height += height_l + height_s
 
         for btn, text, x in zip(self.rank_btn,
-                                ("prev", "manual" if self.auto else "auto", "next"), (0.050, 0.375, 0.700)):
+                                ("前一页", "手动" if self.auto else "自动", "下一页"), (0.050, 0.375, 0.700)):
             btn['font'] = btn_font
             btn['text'] = text
-            btn['bg'] = "#00CED1"
+            btn['bg'] = conf.tk_btn_bg
             btn.place(relx=x, rely=0.93, relwidth=0.25, relheight=0.06)
 
         self.rank_btn[0]['command'] = lambda: self.rank_page_to_prev()
@@ -332,8 +369,9 @@ class RankingStation(RankingStationBase):
 
         for i, info in enumerate(rank_info):
             no, name, uid, score, eval_, color = info
-            self.rank_var[i].set(f"NO.{no}  {name}\nUID: {uid[0:conf.ranking_tk_show_uid_len]}\n"
-                                 f"Score: {score} Reputation: {eval_}")
+            self.rank_var[i].set(f"NO.{no}  {name}\n\n"  # 中间空一行 否则中文字体显得很窄
+                                 f"ID: {uid[0:conf.ranking_tk_show_uid_len]}  "
+                                 f"信用: {eval_} 积分: {score}")
             if color is None:
                 self.rank_label[i]['bg'] = "#F5FFFA"
             else:
@@ -345,16 +383,16 @@ class RankingStation(RankingStationBase):
 
     def show_rank(self, rank_info: List[Tuple[int, uname_t, uid_t, score_t, score_t, Optional[str]]]):
         self.__set_rank_info(rank_info)
-        self.rank_title_var.set("Ranking")
+        self.rank_title_var.set("排行榜")
 
     def rank_auto(self, auto):
         super(RankingStation, self).rank_auto(auto)
         if auto:
             self.rank_btn[1]['command'] = lambda: self.rank_auto(False)
-            self.rank_btn[1]['text'] = 'manual'
+            self.rank_btn[1]['text'] = '手动'
         else:
             self.rank_btn[1]['command'] = lambda: self.rank_auto(True)
-            self.rank_btn[1]['text'] = 'auto'
+            self.rank_btn[1]['text'] = '自动'
 
     def set_next_btn(self, disable: False):
         if disable or self.auto:  # auto 模式令btn失效

+ 7 - 0
control/station.py

@@ -45,10 +45,17 @@ class RankingUserError(GarbageStationException):
 
 
 class GarbageStationBase(TkEventMain, metaclass=abc.ABCMeta):
+    """
+    GarbageStation基类
+    封装GarbageStation的相关操作
+    """
+
+    # 操作状态
     status_normal = 1
     status_get_garbage_type = 2
     status_get_garbage_check = 3
 
+    # 扫码状态
     scan_switch_user = 1
     scan_throw_garbage = 2
     scan_check_garbage = 3

+ 10 - 12
control/station_event.py

@@ -14,7 +14,7 @@ import station as tk_station
 
 
 class StationEventBase(TkEventBase):
-    def __init__(self, station: tk_station.GarbageStationBase, title: str = 'unknown'):
+    def __init__(self, station: tk_station.GarbageStationBase, title: str = '未知'):
         super(StationEventBase, self).__init__()
         self.station: tk_station.GarbageStationBase = station
         self._db: DB = station.get_db()
@@ -30,7 +30,7 @@ class ScanUserEvent(StationEventBase):
         return scan_user(qr, db)
 
     def __init__(self, gb_station):
-        super().__init__(gb_station, "Scan User")
+        super().__init__(gb_station, "扫码用户")
 
         self._user: User = gb_station.get_user()
         self._qr_code: Optional[QRCode] = None
@@ -60,7 +60,7 @@ class ScanGarbageEvent(StationEventBase):
         return scan_garbage(qr, db)
 
     def __init__(self, gb_station):
-        super().__init__(gb_station, "Scan Garbage")
+        super().__init__(gb_station, "扫码垃圾袋")
 
         self._user: User = gb_station.get_user()
         self._qr_code: Optional[QRCode] = None
@@ -78,7 +78,7 @@ class ScanGarbageEvent(StationEventBase):
         self.thread.join()
         if self.thread.result is not None:
             if self._user is None:
-                self.station.show_warning("Operation Fail", "The garbage bags have been used.")
+                self.station.show_warning("操作失败", "垃圾袋已经被使用")
             elif self._user.is_manager():
                 self.station.to_get_garbage_check(self.thread.result)
                 self.station.show_garbage_info()  # 显示信息
@@ -102,7 +102,7 @@ class RankingEvent(StationEventBase):
         return list(cur.fetchall())
 
     def __init__(self, gb_station):
-        super().__init__(gb_station, "Ranking")
+        super().__init__(gb_station, "排行榜")
         self.thread = TkThreading(self.func, self._db)
 
     def is_end(self) -> bool:
@@ -113,7 +113,7 @@ class RankingEvent(StationEventBase):
         if res is not None:
             self.station.thread_show_rank(res)
         else:
-            self.station.show_warning("RankError", f'Unable to get leaderboard data')
+            self.station.show_warning("排行榜错误", f'无法获得排行榜数据')
 
 
 class ThrowGarbageEvent(StationEventBase):
@@ -121,13 +121,12 @@ class ThrowGarbageEvent(StationEventBase):
         try:
             self.station.throw_garbage_core(garbage, garbage_type)
         except (tk_station.ThrowGarbageError, UserNotSupportError, tk_station.ControlNotLogin):
-            self.station.show_warning("Operation Fail", "The garbage bags have been used.")
             return False
         else:
             return True
 
     def __init__(self, gb_station):
-        super().__init__(gb_station, "ThrowGarbage")
+        super().__init__(gb_station, "垃圾投放")
 
         self.thread = None
 
@@ -142,7 +141,7 @@ class ThrowGarbageEvent(StationEventBase):
     def done_after_event(self):
         self.thread.join()
         if not self.thread.result:
-            self.station.show_warning("Operation Fail", "The garbage bag throw error")
+            self.station.show_warning("操作失败", "垃圾袋投放失败")
 
 
 class CheckGarbageEvent(StationEventBase):
@@ -151,13 +150,12 @@ class CheckGarbageEvent(StationEventBase):
             self.station.check_garbage_core(garbage, check)
         except (tk_station.ThrowGarbageError, UserNotSupportError,
                 tk_station.ControlNotLogin, tk_station.CheckGarbageError):
-            self.station.show_warning("Operation Fail", "The garbage bag has been checked")
             return False
         else:
             return True
 
     def __init__(self, gb_station):
-        super().__init__(gb_station, "CheckGarbage")
+        super().__init__(gb_station, "检测垃圾袋")
         self.thread = None
 
     def start(self, garbage: GarbageBag, garbage_check: bool):
@@ -170,4 +168,4 @@ class CheckGarbageEvent(StationEventBase):
     def done_after_event(self):
         self.thread.join()
         if not self.thread.result:
-            self.station.show_warning("Operation Fail", "The garbage bag check error")
+            self.station.show_warning("操作失败", "垃圾袋检测失败")