2

Python新手在这里。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import commands,time

def get_vol():
    vol =int(commands.getoutput("amixer get Master | grep -E -o '[0-9]
{1,3}?%' | head -1 | sed 's/.$//'"))
    full_block =(vol+10)/10-1 
    if vol%10==0:
        half_block =0
    else:
        half_block =1
    empty_block =10-(full_block+half_block)
    return '▮'*full_block+'▯'*half_block+'-'*empty_block

def NTime():
    return commands.getoutput("date '+%H:%M'")

def battery():
    prenBat =int(commands.getoutput('acpi battery | grep -o "[0-9]*[0-9]" | sed "1d"'))
    bat_icon =prenBat/20
    status =commands.getoutput('acpi battery | egrep -o -m1 "Discharging|Charging|AC|Full|Unknown"')
    if status== "Charging":
        return '❖'+' ●'*bat_icon+' ○'*(5-bat_icon)
    elif status=="Full":
        return '✔'+' ●'*bat_icon+' ○'*(5-bat_icon)
    else:
        return ' ●'*bat_icon+' ○'*(5-bat_icon)


battime =1
batNum =battery()

while True:
    time.sleep(0.1)
    volume =get_vol()
    nTime =NTime()
    while battime ==30:
        batNum =str(battery())
        battime =1
    else:
        battime =battime+1
    print batNum+" | "+volume+" | "+nTime 

我直接使用这个脚本到 i3bar(没有 i3blocks),它什么也没显示。然后我等了一会儿。它显示了 barttery,但没有音量部分和时间部分。然后,我猜大约 10 秒。它从体积部分显示了一两个块(▮)。没有别的。

我尝试在终端中对其进行测试,结果很好。这是我来自 i3config 的 i3bar 部分。

bar {
       position top 
       colors {
       statusline #414149
    background #8cb194
    separator #414149
    focused_workspace  #8cb194 #c8d087 #000000
    inactive_workspace #8cb194 #868974 #000000
    }
#   status_command i3blocks -c ~/.config/i3blocks.conf
    status_command ~/.config/bar.py
}

对不起我的英语和新手代码。

4

1 回答 1

0

i3bar 预期的输入格式是 json,如以下文档链接所述:

其他一些评论:

  • 由于commands模块已被弃用并且在 Python3 中不存在,您可能会考虑使用 subprocess 来代替运行命令。
  • 0.1s 的睡眠时间可能太激进了,您可以考虑将间隔更改几秒钟,因为电池和音量值不会经常更改,这也可以避免浪费过多的 CPU。
  • 您可以考虑使用 Python 本身进行字符串操作部分,而不是使用大量的 sed 和 grep,这样即使在不同的操作系统上也会产生更多可用的代码。
  • 如 PEP8其他建议部分所述,其良好做法是“始终在两侧使用单个空格包围运算符:赋值 (=)、扩充赋值 (+=、-= 等)、比较 (==、<、>、 !=, <>, <=, >=, in, not in, is, is not), Booleans (and, or, not)。”
  • 将代码主体放在 main 方法中允许您将代码导入其他脚本或从 REPL 中导入 - 除了有助于实施范围并使您的代码看起来更清晰的形式...请阅读以下链接

希望能帮助到你!

于 2020-02-12T12:31:00.057 回答