如何在给定位置显示文字?

时间:2017-05-05 16:32:37

标签: python raspberry-pi

我的第一篇文章,我很早就学习了Python。请温柔。 我这里有一段代码可以工作,但很难读出输出。 我想静态地在屏幕上显示传感器,而不是在向下滚动屏幕的升序列表中。 是否可以更改打印功能,以便在shell窗口的单个位置每隔X秒更新一次临时值?提前致谢

import os
import glob
import time

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

def read_temp_raw(i):
    base_dir = '/sys/bus/w1/devices/'
    device_folder = glob.glob(base_dir + '28*')[i]
    device_file = device_folder + '/w1_slave'
    f = open(device_file, 'r')
    lines = f.readlines()
    f.close()
    return lines

def read_temp(i):
    lines = read_temp_raw(i)
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        temp_f = temp_c * 9.0 / 5.0 + 32.0
        return temp_c, temp_f

while True:
    print "Sensor 1", (read_temp(0))
    print "Sensor 2", (read_temp(1))
    print "Sensor 3", (read_temp(2))
    time.sleep(2)

1 个答案:

答案 0 :(得分:1)

要始终在屏幕中的同一位置打印元素,您可以使用一些特殊的控制台字符:

  • ASCII字符\r将始终覆盖同一行

所以,如果你这样做:

# use the new format of print, not the old one
from __future__ import print_function

while True:
    print ("Sensors: {}\t{}\t{}     ".format(
              read_temp(0), read_temp(1), read_temp(2)), end='\r')
    time.sleep(2)

你只有一行会刷新自己:

Sensors: 42    42    42

该解决方案适用于大多数控制台,包括Windows。

如果你想要总是有三行,那么你需要在每次循环时清除屏幕:

  • ANSI命令\33[2J将清除屏幕(当您点击键盘绑定时 C - L )。

即:

while True:
    print('\33[2J')
    print('Sensor 1: {}'.format(read_temp(0)))
    print('Sensor 2: {}'.format(read_temp(1)))
    print('Sensor 3: {}'.format(read_temp(2)))

虽然该解决方案不适用于非ANSI控制台。

  • 如果要制作更复杂的输出,可以使用基于blessings的{​​{1}}库,并允许您在命令行中绘制用户界面。

这里是如何:

ncurses

这样您就不必关心使用特殊字符,只需使用列+行(import blessings term = blessings.Terminal() with term.fullscreen(): while True: with term.location(0, 0): print('--- This is the first line ---') print('Sensor 1: {t.bold}{}{t.normal}'.format(read_temp(0), t=term)) print('Sensor 2: {t.bold}{}{t.normal}'.format(read_temp(1), t=term)) print('Sensor 3: {t.bold}{}{t.normal}'.format(read_temp(2), t=term)) print('--- This is the fifth line ---') 0, 0参数进行定位。

将打印:

location()

位于控制台顶部。

N.B。:作为旁注,使用起来更好更安全:

--- This is the first line ---
Sensor 1: 0
Sensor 2: 122
Sensor 3: 244
--- This is the fifth line ---

即使读取失败也会关闭设备文件。