现在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 &保存,即可实现开机启动。