个人博客: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 &保存,即可实现开机启动。
转载:https://blog.csdn.net/qq_37394634/article/details/105494935
查看评论