with open('core/ui/flet/app_v2.py', 'r', encoding='utf-8') as f: content = f.read() # Patch 1: Add lock alongside _score_refreshing init old_init = " self._score_refreshing = False # 刷新锁" new_init = " self._score_refreshing = False\n self._score_lock = threading.Lock()" content = content.replace(old_init, new_init, 1) print('Patch 1 (init):', 'OK' if old_init not in content else 'NOT FOUND') # Patch 2: _prev_day - use lock instead of flag guard old_prev = ''' def _prev_day(_): if self._score_refreshing: return self._score_cur_date -= timedelta(days=1) self._score_date_label.value = str(self._score_cur_date) self._score_refreshing = True self._score_nav_btns[0].disabled = True self._score_nav_btns[1].disabled = True self._score_nav_btns[2].disabled = True self._refresh_scoring()''' new_prev = ''' def _prev_day(_): if not self._score_lock.acquire(blocking=False): return self._score_cur_date -= timedelta(days=1) self._score_date_label.value = str(self._score_cur_date) self._score_date_label.update() self._score_refreshing = True for btn in self._score_nav_btns: btn.disabled = True for btn in self._score_nav_btns: btn.update() self._refresh_scoring()''' content = content.replace(old_prev, new_prev, 1) print('Patch 2 (_prev_day):', 'OK' if old_prev not in content else 'NOT FOUND') # Patch 3: _next_day - use lock old_next = ''' def _next_day(_): if self._score_refreshing: return if self._score_cur_date >= self._score_max_date: return self._score_cur_date += timedelta(days=1) self._score_date_label.value = str(self._score_cur_date) self._score_refreshing = True self._score_nav_btns[0].disabled = True self._score_nav_btns[1].disabled = True self._score_nav_btns[2].disabled = True self._refresh_scoring()''' new_next = ''' def _next_day(_): if not self._score_lock.acquire(blocking=False): return if self._score_cur_date >= self._score_max_date: self._score_lock.release() return self._score_cur_date += timedelta(days=1) self._score_date_label.value = str(self._score_cur_date) self._score_date_label.update() self._score_refreshing = True for btn in self._score_nav_btns: btn.disabled = True for btn in self._score_nav_btns: btn.update() self._refresh_scoring()''' content = content.replace(old_next, new_next, 1) print('Patch 3 (_next_day):', 'OK' if old_next not in content else 'NOT FOUND') # Patch 4: _today - use lock old_today = ''' def _today(_): if self._score_refreshing: return if self._score_cur_date >= self._score_max_date: return self._score_cur_date = self._score_max_date self._score_date_label.value = str(self._score_cur_date) self._score_refreshing = True self._score_nav_btns[0].disabled = True self._score_nav_btns[1].disabled = True self._score_nav_btns[2].disabled = True self._refresh_scoring()''' new_today = ''' def _today(_): if not self._score_lock.acquire(blocking=False): return if self._score_cur_date >= self._score_max_date: self._score_lock.release() return self._score_cur_date = self._score_max_date self._score_date_label.value = str(self._score_cur_date) self._score_date_label.update() self._score_refreshing = True for btn in self._score_nav_btns: btn.disabled = True for btn in self._score_nav_btns: btn.update() self._refresh_scoring()''' content = content.replace(old_today, new_today, 1) print('Patch 4 (_today):', 'OK' if old_today not in content else 'NOT FOUND') # Patch 5: _revert_nav_btns - release lock at end old_revert = ''' def _revert_nav_btns(self): """重新启用导航按钮并解除刷新锁;已达上限日期时禁用'明天'和'今天'按钮""" self._score_refreshing = False at_max = self._score_cur_date >= self._score_max_date for btn in self._score_nav_btns: btn.disabled = False if at_max: self._score_nav_btns[1].disabled = True # next self._score_nav_btns[2].disabled = True # today for btn in self._score_nav_btns: btn.update()''' new_revert = ''' def _revert_nav_btns(self): """重新启用导航按钮并解除刷新锁;已达上限日期时禁用'明天'和'今天'按钮""" self._score_refreshing = False at_max = self._score_cur_date >= self._score_max_date for btn in self._score_nav_btns: btn.disabled = False if at_max: self._score_nav_btns[1].disabled = True # next self._score_nav_btns[2].disabled = True # today for btn in self._score_nav_btns: btn.update() self._score_lock.release()''' content = content.replace(old_revert, new_revert, 1) print('Patch 5 (_revert_nav_btns):', 'OK' if old_revert not in content else 'NOT FOUND') with open('core/ui/flet/app_v2.py', 'w', encoding='utf-8') as f: f.write(content) print('Done writing')