fix(cli): reduce spinner flickering under patch_stdout
KawaiiSpinner used a two-phase clear+redraw approach: first write \r + spaces to blank the line, then \r + new frame. When running inside prompt_toolkit's patch_stdout proxy, each phase could trigger a separate repaint, causing visible flickering every 120ms. Replace with a single \r\033[K (carriage return + ANSI erase-to-EOL) write so the line is cleared and redrawn atomically.
This commit is contained in:
parent
bf9dd83c10
commit
f92875bc3e
1 changed files with 4 additions and 3 deletions
|
|
@ -182,8 +182,9 @@ class KawaiiSpinner:
|
||||||
frame = self.spinner_frames[self.frame_idx % len(self.spinner_frames)]
|
frame = self.spinner_frames[self.frame_idx % len(self.spinner_frames)]
|
||||||
elapsed = time.time() - self.start_time
|
elapsed = time.time() - self.start_time
|
||||||
line = f" {frame} {self.message} ({elapsed:.1f}s)"
|
line = f" {frame} {self.message} ({elapsed:.1f}s)"
|
||||||
clear = '\r' + ' ' * self.last_line_len + '\r'
|
# Use \r + ANSI erase-to-EOL in a single write to avoid the
|
||||||
self._write(clear + line, end='', flush=True)
|
# two-phase clear+redraw that flickers under patch_stdout.
|
||||||
|
self._write(f"\r\033[K{line}", end='', flush=True)
|
||||||
self.last_line_len = len(line)
|
self.last_line_len = len(line)
|
||||||
self.frame_idx += 1
|
self.frame_idx += 1
|
||||||
time.sleep(0.12)
|
time.sleep(0.12)
|
||||||
|
|
@ -203,7 +204,7 @@ class KawaiiSpinner:
|
||||||
self.running = False
|
self.running = False
|
||||||
if self.thread:
|
if self.thread:
|
||||||
self.thread.join(timeout=0.5)
|
self.thread.join(timeout=0.5)
|
||||||
self._write('\r' + ' ' * (self.last_line_len + 5) + '\r', end='', flush=True)
|
self._write('\r\033[K', end='', flush=True)
|
||||||
if final_message:
|
if final_message:
|
||||||
self._write(f" {final_message}", flush=True)
|
self._write(f" {final_message}", flush=True)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue