Skip to content

Polybar 添加自定义脚本(以网络测速模块为例)

所学知识

  • Polybar 如何添加自己的脚本来显示模块
  • Polybar 如何进行鼠标左键点击切换
  • Python 信号处理、一直睡眠、睡眠唤醒
  • 查看当前网络信息、当前网速

Polybar 添加自己的脚本来显示模块

首先脚本要输出想输出的内容,注意要使用 os.system('echo ..'),而不是 print('..')
然后 Polybar 里面有定义的模块可以显示,方式如下。

[module/my_moudle]
type = custom/script
exec = python /path/to/script.py
tail = true
click-left = kill -USR1 %pid%
format-underline = #9f78e1

要关注这个 click-left,它就是鼠标左键事件,至于为什么用后面的命令,用于后面的切换,具体看后面。我们先去了解 Python 的一些特征。

Python 信号机制、一直睡眠、睡眠唤醒

对于显示的脚本,让它接收 sigUSR1 这个用户自定义信号会触发固定函数,方式如下。

def change_toggle(signum, action):
    print('this will be trigged if kill -USR1 this_pid')

signal.signal(signal.SIGUSR1, change_toggle)

利用 threadingevent 可实现 Python 程序一直睡眠,并且结合信号机制进行睡眠唤醒。

from threading import Event
sleep_event = Event()

def change_toggle(signum, action):
    sleep_event.set()

signal.signal(signal.SIGUSR1, change_toggle)

while true:
    sleep_event.wait()

可以理解为 Event() 维护一个布尔变量,主要是有四个方法: waitsetclearis_set
is_set(): 查看这个布尔变量是否为真
wait(xx): 睡眠 xx 秒,但是一旦那个布尔变量是真,就会直接醒来
set(), clear(): 设置这个布尔变量

Polybar 鼠标左键切换

进行切换就使用一个全局变量 toggle_flag,根据它的真假值来进行不同的输出格式,因此切换它也就完成了切换输出内容。每次有 USR1 信号来就转换 toogle_flag 的真假。然后主程序就利用 threading.Event() 进行等待。

def change_toggle(signum, action):
    global toggle_flag
    toggle_flag = not toggle_flag
    sleep_event.set()
signal.signal(signal.SIGUSR1, change_toggle)

while True:
    sleep_event.clear()
    sleep_event.wait(interval)

Polybar 的设置如下,即鼠标左键点击会发送一个 USR1 信号。

[module/my_moudle]
type = custom/script
exec = python /path/to/script.py
click-left = kill -USR1 %pid%

Linux 查看当前网速、网络信息

查看当前网络名称使用 iwgetid -r,查看当前网络详细信息使用 iwconfig wlan0 (wlan0 是无线网卡名称,使用 ip addr 查看),其中 ESSID 表示网络名称,Quality 表示网络质量。

查看当前网络上传速度通过读取文件 /sys/class/net/wlan0/statistics/rx_bytes
查看当前网络下载速度通过读取文件 /sys/class/net/wlan0/statistics/tx_bytes
二者都是通过读取文件内容变化来获取,比如每隔 10 s 查看增加多少,除以 10 就得到每秒变化情况。

Comments