我的第一篇文章,我很早就学习了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)
答案 0 :(得分:1)
要始终在屏幕中的同一位置打印元素,您可以使用一些特殊的控制台字符:
\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。
如果你想要总是有三行,那么你需要在每次循环时清除屏幕:
\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 ---
即使读取失败也会关闭设备文件。