分页: 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
感谢依云仙子。经测试特别好用