个人博客:http://www.chenjianqu.com/
原文链接:http://www.chenjianqu.com/show-112.html
现在Ubuntu16.04是我的主力系统,因此想用的舒服一点。我个人非常重视壁纸,好的壁纸令人心情愉悦。但是在Ubuntu上似乎没有很好的壁纸管理工具,反正我没找到满意的。因此,这里写一个简单的自动切换壁纸的python程序。
程序思路是这样的:在给定壁纸文件夹的情况下,通过python调用命令行实现壁纸设置。每隔30s切换一次壁纸。可以将文件夹内的壁纸标记为“我喜欢”,然后也可以只切换我喜欢的壁纸。而且喜爱程度越高,该壁纸出现的概率越大。
然后本文通过curses库配置的终端进行交互。为了不使用图形界面?因为我懒得写,通过终端交互就够了。
代码如下:
import os
import shutil
import commands
import random
import time
import curses
import locale#解决中文乱码
import pickle
#a=97 A=65
if __name__=="__main__":
path="/media/chen/chen/Photo/4k" #壁纸路径
dict_path="/media/chen/chen/Photo/4k.pkl" #配置关键保存目录
#定义全局变量
names=os.listdir(path)
love_list=list()
love_dict=dict()
is_run=True
t=0
last_name=''
name=''
mode=0 #0随机切换壁纸模式 1切换喜欢的壁纸模式
last_output=''
#curses初始化
locale.setlocale(locale.LC_ALL, '') #解决curses中文乱码
screen=curses.initscr()#初始化curses
curses.noecho()#设置不回显
curses.cbreak()#设置不需要按回车立即响应
screen.keypad(1)#开启键盘模式
screen.nodelay(1) #阻塞模式读取0 非阻塞 1
#显示帮助信息
def display_help():
global screen
screen.clear()
(h,w)=screen.getmaxyx()
if(h<=12):
return 0
else:
i=0
screen.addstr(i, 0,"del:删除该壁纸")
i+=1
screen.addstr(i, 0,"h:帮助信息")
i+=1
screen.addstr(i, 0,"l:喜欢该壁纸")
i+=1
screen.addstr(i, 0,"m:随机的壁纸模式")
i+=1
screen.addstr(i, 0,"n:喜欢的壁纸模式")
i+=1
screen.addstr(i, 0,"o:输出喜欢壁纸")
i+=1
screen.addstr(i, 0,"q:退出程序")
i+=1
screen.addstr(i, 0,"s:停止/继续切换壁纸")
i+=1
screen.addstr(i, 0,"->:下一张壁纸")
i+=1
screen.addstr(i, 0,"<-:上一张壁纸")
i+=1
screen.refresh()
return i
#先显示帮助信息,再显示字符串s
def display(s):
global screen,last_output
screen.clear()
i=display_help()
screen.addstr(i, 0,"上一条输出:"+last_output)
i+=1
screen.addstr(i, 0,"当前的输出:"+s)
screen.refresh()
last_output=s
#输出数据结构L的内容
def display_list(L):
global screen
screen.clear()
(h,w)=screen.getmaxyx()
if(len(L)<h):
for i,e in enumerate(L):
screen.addstr(i,0,str(e[1])+' '+str(e[0]))
else:
for i,e in enumerate(L[-h:]):
screen.addstr(i,0,str(e[1])+' '+str(e[0]))
screen.refresh()
#随机获取喜欢的壁纸
def get_love_img():#根据喜欢的程序获得图片
S=0
for e in love_list:
S+=e[1]
r=random.randint(0,S)
P=0
for e in love_list:
P+=e[1]
if(r<P):
return e[0]
return love_list[0][0]
#设置壁纸
def SetWallpapers():
global name,last_name,love_list,name,names,path,t,mode
last_name=name
if(mode==1 and len(love_list)>0):
name=get_love_img()
elif(mode==0):
name=names[random.randint(0,len(names))]
source_path = os.path.join(path, name)
commands.getoutput(r'gsettings set org.gnome.desktop.background picture-uri "file:'+source_path+r'"')
display(name)
t=0
#刷新喜欢的壁纸
def updateLoveWallpapers():
global love_list,love_dict,dict_path
love_list= sorted(love_dict.items(),key=lambda x:x[1],reverse = True)
with open(dict_path, 'wb') as f:
pickle.dump(love_dict, f, pickle.HIGHEST_PROTOCOL)
#不存在该文件 则创建
if(not os.path.exists(dict_path)):
with open(dict_path, 'wb') as f:
pickle.dump(love_dict, f, pickle.HIGHEST_PROTOCOL)
#否则加载字典
else:
with open(dict_path, 'rb') as f:
love_dict=pickle.load(f)
love_list= sorted(love_dict.items(),key=lambda x:x[1],reverse = True)
#主进程
while True:
char=screen.getch()
if(char==261):#'->' 下一张
SetWallpapers()
elif(char==260):#'<-' 上一张
name=last_name
source_path = os.path.join(path, name)
commands.getoutput(r'gsettings set org.gnome.desktop.background picture-uri "file:'+source_path+r'"')
display(name)
t=0
elif(char==113):#'q' 退出
#恢复控制台默认设置(若不恢复,会导致即使程序结束退出了,控制台仍然是没有回显的)
curses.nocbreak()
screen.keypad(0)
curses.echo()
#结束窗口
curses.endwin()
break
elif(char==330):#'del'删除该壁纸
if(mode==0):
#文件删除
source_path = os.path.join(path, name)
os.remove(source_path)
display('已删除 '+source_path)
#更新壁纸列表
names=os.listdir(path)
#更新喜欢的壁纸
if(name in love_dict.keys()):
love_dict.pop(name)
updateLoveWallpapers()
elif(mode==1):
love_dict.pop(name)
updateLoveWallpapers()
display('从喜欢壁纸中移除'+name)
SetWallpapers()
elif(char==115):#'s' 停止/继续切换壁纸
if(is_run):
display("停止更换壁纸\n")
is_run=False
else:
display("继续更换壁纸\n")
is_run=True
elif(char==108):#'l' 喜欢该壁纸
if(name not in love_dict.keys()):
love_dict[name]=1
else:
love_dict[name]+=1
updateLoveWallpapers()
display('喜欢该壁纸')
elif(char==109):#'m' 随机切换壁纸模式
mode=0
display("随机模式")
elif(char==110):#'n' 切换喜欢壁纸模式
mode=1
display("喜欢模式")
elif(char==111):#'o' 输出喜欢的壁纸列表
display_list(love_list)
elif(char==104):#'h' 查看帮助信息
display_help()
if(is_run and t>300):#每隔30s更换壁纸
SetWallpapers()
time.sleep(0.1) #暂停0.1s
t+=1
需要注意的,当curses库的addstr()函数输出的内容超出终端窗口大小时,回报错。因此通过getmaxxy()函数限制输出的行数。
比如我有如下的壁纸文件夹:
运行后主要的输出信息:
查看喜欢的壁纸,下面的某图片的喜欢次数越多,在喜欢的壁纸模式下,该图片出现的概率越大
设置开机自启动:新建一个.sh脚本,输入python wallpaper.py,保存为wallpaper.sh。然后在/etc/re.local中输入bash /home/chen/wallpaper.sh &保存,即可实现开机启动。