Ubuntu自动更换壁纸

    现在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()函数限制输出的行数。

    比如我有如下的壁纸文件夹:

图片1.jpg

    运行后主要的输出信息:

图片2.jpg

    查看喜欢的壁纸,下面的某图片的喜欢次数越多,在喜欢的壁纸模式下,该图片出现的概率越大

图片3.jpg

    设置开机自启动:新建一个.sh脚本,输入python wallpaper.py,保存为wallpaper.sh。然后在/etc/re.local中输入bash /home/chen/wallpaper.sh &保存,即可实现开机启动。






上一篇:
下一篇: 没有了

首页 所有文章 机器人 计算机视觉 自然语言处理 机器学习 编程随笔 关于