分页: 1 / 1

编程小白对屏幕上打印 提问

发表于 : 2022-11-02 21:59
william1204
我在写一些小程序,使用printf打印检测某个传感器(譬如GPIO)的值,但我只能实现printf("\n")这样打印,我想着如何想在终端屏幕的固定位置显示我想打印的值,并且可变,类似与htop那种显示CPU的数字百分比。我应该学习哪方面的知识?

Re: 编程小白对屏幕上打印 提问

发表于 : 2022-11-03 10:08
lilydjwg
终端编程、ncurses 库、ANSI 转义序列、Python 的 urwid 库也挺好的。

Re: 编程小白对屏幕上打印 提问

发表于 : 2022-11-03 11:31
astolia
单纯显示的话,纯shell也可以。用tput cols和tput lines获取终端大小(bash可以直接用COLUMNS和LINES),然后通过换行、空格等在指定位置输出文本

随手写了段在终端中央计数的脚本

代码: 全选

#!/bin/bash
PS1=""
N=0
tput civis
while true; do
  N=$((N + 1))
  tput clear
  #COLUMNS=$(tput cols)
  #LINES=$(tput lines)
  LINE=$(( LINES / 2 ))
  for (( i=0; i < LINE; i++ )); do
    echo
  done
  LEN=$(echo -n $N | wc -m)
  POS=$(( ( COLUMNS - LEN ) / 2 ))
  for (( j=0; j < POS; j++ )); do
    echo -n " "
  done
  echo $N
  sleep 0.1
done

Re: 编程小白对屏幕上打印 提问

发表于 : 2022-11-03 11:48
lilydjwg
你这每次 reset 然后用换行和空格抵达目标位置也太……想起 MS Word 缩进、右对齐用空格的人。
不如这样:

代码: 全选

#!/bin/bash -e

tput smcup civis
trap 'tput rmcup cnorm; exit' TERM INT

i=0
while true; do
  printf "\e[%d;%df%4d\e[K" $(( LINES / 2 )) $(( COLUMNS / 2 - 2 )) $(( i++ ))
  sleep 0.1
done

Re: 编程小白对屏幕上打印 提问

发表于 : 2022-11-03 12:10
astolia
lilydjwg 写了: 2022-11-03 11:48 你这每次 reset 然后用换行和空格抵达目标位置也太……想起 MS Word 缩进、右对齐用空格的人。
不如这样:

代码: 全选

#!/bin/bash -e

tput smcup civis
trap 'tput rmcup cnorm; exit' TERM INT

i=0
while true; do
  printf "\e[%d;%df%4d\e[K" $(( LINES / 2 )) $(( COLUMNS / 2 - 2 )) $(( i++ ))
  sleep 0.1
done
随手写啊,有去查转义序列的时间,循环早写完了

Re: 编程小白对屏幕上打印 提问

发表于 : 2022-11-03 12:21
lilydjwg
不要教坏新人啊。另外这种文档不放在手边么?

Re: 编程小白对屏幕上打印 提问

发表于 : 2022-11-03 12:24
astolia
lilydjwg 写了: 2022-11-03 12:21 不要教坏新人啊。另外这种文档不放在手边么?
这对我来说是平均一年都用不了一次的东西

Re: 编程小白对屏幕上打印 提问

发表于 : 2023-05-11 16:26
k9288k
lilydjwg 写了: 2022-11-03 11:48 你这每次 reset 然后用换行和空格抵达目标位置也太……想起 MS Word 缩进、右对齐用空格的人。
不如这样:

代码: 全选

#!/bin/bash -e

tput smcup civis
trap 'tput rmcup cnorm; exit' TERM INT

i=0
while true; do
  printf "\e[%d;%df%4d\e[K" $(( LINES / 2 )) $(( COLUMNS / 2 - 2 )) $(( i++ ))
  sleep 0.1
done
感谢依云仙子。经测试特别好用