飞道的博客

Ubuntu自动更换壁纸

328人阅读  评论(0)

个人博客:http://www.chenjianqu.com/

原文链接:http://www.chenjianqu.com/show-112.html

  现在Ubuntu16.04是我的主力系统,因此想用的舒服一点。我个人非常重视壁纸,好的壁纸令人心情愉悦。但是在Ubuntu上似乎没有很好的壁纸管理工具,反正我没找到满意的。因此,这里写一个简单的自动切换壁纸的python程序。

    程序思路是这样的:在给定壁纸文件夹的情况下,通过python调用命令行实现壁纸设置。每隔30s切换一次壁纸。可以将文件夹内的壁纸标记为“我喜欢”,然后也可以只切换我喜欢的壁纸。而且喜爱程度越高,该壁纸出现的概率越大。

    然后本文通过curses库配置的终端进行交互。为了不使用图形界面?因为我懒得写,通过终端交互就够了。

    代码如下:


  
  1. import os
  2. import shutil
  3. import commands
  4. import random
  5. import time
  6. import curses
  7. import locale #解决中文乱码
  8. import pickle
  9. #a=97 A=65
  10. if __name__== "__main__":
  11. path= "/media/chen/chen/Photo/4k" #壁纸路径
  12. dict_path= "/media/chen/chen/Photo/4k.pkl" #配置关键保存目录
  13. #定义全局变量
  14. names=os.listdir(path)
  15. love_list=list()
  16. love_dict=dict()
  17. is_run= True
  18. t= 0
  19. last_name= ''
  20. name= ''
  21. mode= 0 #0随机切换壁纸模式 1切换喜欢的壁纸模式
  22. last_output= ''
  23. #curses初始化
  24. locale.setlocale(locale.LC_ALL, '') #解决curses中文乱码
  25. screen=curses.initscr() #初始化curses
  26. curses.noecho() #设置不回显
  27. curses.cbreak() #设置不需要按回车立即响应
  28. screen.keypad( 1) #开启键盘模式
  29. screen.nodelay( 1) #阻塞模式读取0 非阻塞 1
  30. #显示帮助信息
  31. def display_help():
  32. global screen
  33. screen.clear()
  34. (h,w)=screen.getmaxyx()
  35. if(h<= 12):
  36. return 0
  37. else:
  38. i= 0
  39. screen.addstr(i, 0, "del:删除该壁纸")
  40. i+= 1
  41. screen.addstr(i, 0, "h:帮助信息")
  42. i+= 1
  43. screen.addstr(i, 0, "l:喜欢该壁纸")
  44. i+= 1
  45. screen.addstr(i, 0, "m:随机的壁纸模式")
  46. i+= 1
  47. screen.addstr(i, 0, "n:喜欢的壁纸模式")
  48. i+= 1
  49. screen.addstr(i, 0, "o:输出喜欢壁纸")
  50. i+= 1
  51. screen.addstr(i, 0, "q:退出程序")
  52. i+= 1
  53. screen.addstr(i, 0, "s:停止/继续切换壁纸")
  54. i+= 1
  55. screen.addstr(i, 0, "->:下一张壁纸")
  56. i+= 1
  57. screen.addstr(i, 0, "<-:上一张壁纸")
  58. i+= 1
  59. screen.refresh()
  60. return i
  61. #先显示帮助信息,再显示字符串s
  62. def display(s):
  63. global screen,last_output
  64. screen.clear()
  65. i=display_help()
  66. screen.addstr(i, 0, "上一条输出:"+last_output)
  67. i+= 1
  68. screen.addstr(i, 0, "当前的输出:"+s)
  69. screen.refresh()
  70. last_output=s
  71. #输出数据结构L的内容
  72. def display_list(L):
  73. global screen
  74. screen.clear()
  75. (h,w)=screen.getmaxyx()
  76. if(len(L)<h):
  77. for i,e in enumerate(L):
  78. screen.addstr(i, 0,str(e[ 1])+ ' '+str(e[ 0]))
  79. else:
  80. for i,e in enumerate(L[-h:]):
  81. screen.addstr(i, 0,str(e[ 1])+ ' '+str(e[ 0]))
  82. screen.refresh()
  83. #随机获取喜欢的壁纸
  84. def get_love_img(): #根据喜欢的程序获得图片
  85. S= 0
  86. for e in love_list:
  87. S+=e[ 1]
  88. r=random.randint( 0,S)
  89. P= 0
  90. for e in love_list:
  91. P+=e[ 1]
  92. if(r<P):
  93. return e[ 0]
  94. return love_list[ 0][ 0]
  95. #设置壁纸
  96. def SetWallpapers():
  97. global name,last_name,love_list,name,names,path,t,mode
  98. last_name=name
  99. if(mode== 1 and len(love_list)> 0):
  100. name=get_love_img()
  101. elif(mode== 0):
  102. name=names[random.randint( 0,len(names))]
  103. source_path = os.path.join(path, name)
  104. commands.getoutput( r'gsettings set org.gnome.desktop.background picture-uri "file:'+source_path+ r'"')
  105. display(name)
  106. t= 0
  107. #刷新喜欢的壁纸
  108. def updateLoveWallpapers():
  109. global love_list,love_dict,dict_path
  110. love_list= sorted(love_dict.items(),key= lambda x:x[ 1],reverse = True)
  111. with open(dict_path, 'wb') as f:
  112. pickle.dump(love_dict, f, pickle.HIGHEST_PROTOCOL)
  113. #不存在该文件 则创建
  114. if( not os.path.exists(dict_path)):
  115. with open(dict_path, 'wb') as f:
  116. pickle.dump(love_dict, f, pickle.HIGHEST_PROTOCOL)
  117. #否则加载字典
  118. else:
  119. with open(dict_path, 'rb') as f:
  120. love_dict=pickle.load(f)
  121. love_list= sorted(love_dict.items(),key= lambda x:x[ 1],reverse = True)
  122. #主进程
  123. while True:
  124. char=screen.getch()
  125. if(char== 261): #'->' 下一张
  126. SetWallpapers()
  127. elif(char== 260): #'<-' 上一张
  128. name=last_name
  129. source_path = os.path.join(path, name)
  130. commands.getoutput( r'gsettings set org.gnome.desktop.background picture-uri "file:'+source_path+ r'"')
  131. display(name)
  132. t= 0
  133. elif(char== 113): #'q' 退出
  134. #恢复控制台默认设置(若不恢复,会导致即使程序结束退出了,控制台仍然是没有回显的)
  135. curses.nocbreak()
  136. screen.keypad( 0)
  137. curses.echo()
  138. #结束窗口
  139. curses.endwin()
  140. break
  141. elif(char== 330): #'del'删除该壁纸
  142. if(mode== 0):
  143. #文件删除
  144. source_path = os.path.join(path, name)
  145. os.remove(source_path)
  146. display( '已删除 '+source_path)
  147. #更新壁纸列表
  148. names=os.listdir(path)
  149. #更新喜欢的壁纸
  150. if(name in love_dict.keys()):
  151. love_dict.pop(name)
  152. updateLoveWallpapers()
  153. elif(mode== 1):
  154. love_dict.pop(name)
  155. updateLoveWallpapers()
  156. display( '从喜欢壁纸中移除'+name)
  157. SetWallpapers()
  158. elif(char== 115): #'s' 停止/继续切换壁纸
  159. if(is_run):
  160. display( "停止更换壁纸\n")
  161. is_run= False
  162. else:
  163. display( "继续更换壁纸\n")
  164. is_run= True
  165. elif(char== 108): #'l' 喜欢该壁纸
  166. if(name not in love_dict.keys()):
  167. love_dict[name]= 1
  168. else:
  169. love_dict[name]+= 1
  170. updateLoveWallpapers()
  171. display( '喜欢该壁纸')
  172. elif(char== 109): #'m' 随机切换壁纸模式
  173. mode= 0
  174. display( "随机模式")
  175. elif(char== 110): #'n' 切换喜欢壁纸模式
  176. mode= 1
  177. display( "喜欢模式")
  178. elif(char== 111): #'o' 输出喜欢的壁纸列表
  179. display_list(love_list)
  180. elif(char== 104): #'h' 查看帮助信息
  181. display_help()
  182. if(is_run and t> 300): #每隔30s更换壁纸
  183. SetWallpapers()
  184. time.sleep( 0.1) #暂停0.1s
  185. 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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场