我想将“待办事项”列表设为壁纸。我希望能够编写一个文本文件,保存它,并在每次编辑文件时更新背景。这可能吗?
答案1
下面的脚本监视一个您可以编辑的文本文件。如果文件发生更改,它将使用文件文本在墙纸上创建一个新层。
选项
你可以定义:
- 字体大小
- 文字颜色
- 列数
- 每列最大行数
- 边框宽度(文本块周围)
如何使用
该脚本使用 Imagemagick,您可能必须先安装它:
sudo apt-get install imagemagick
然后:
- 将下面的脚本复制到一个空文件中并将其保存为
walltext.py
。 - 编辑,如果您想要特定的设置,则编辑脚本头部部分的选项。
- 进入同一文件夹,复制您选择的壁纸,并命名(准确)
original.jpg
NB- 重要的是您的壁纸的比例与您的屏幕分辨率的比例相匹配,否则文本将无法正确定位。 - 在同一文件夹中,创建一个名为 notes.txt 的空文本文件。这是用于制作待办事项列表或您想要在屏幕上显示的任何内容的文件。
通过以下命令运行脚本:
python3 /path/to/walltext.py
现在开始编辑文本文件。每隔五秒钟,壁纸就会根据需要更新(保存更改后):
例子
1 列,每列最多 30 行
2 列,每列最多 20 行
3 列,每列最多 10 行
剧本
#!/usr/bin/env python3
import subprocess
import os
import time
curr_dir = os.path.dirname(os.path.realpath(__file__))
curr_wall = curr_dir+"/"+"original.jpg"
notes = curr_dir+"/"+"notes.txt"
#--
text_color = "white" # text color
size = "20" # text size (real size depends on the scale factor of your wallpaper)
border = 120 # space around your text blocks
columns = 2 # (max) number of columns
n_lines = 10 # (max) number of lines per column
#--
def run_command(cmd):
subprocess.call(["/bin/bash", "-c", cmd])
def get_value(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8").strip()
def read_text(file):
with open(file) as src:
return [l.strip() for l in src.readlines()]
def slice_lines(lines, n_lines, columns):
markers = [i for i in range(len(lines)) if i % n_lines == 0]
last = len(lines); markers = markers+[last] if markers[-1] != last else markers
textblocks = [lines[markers[i]:markers[i+1]] for i in range(len(markers)-1)]
filled_blocks = len(textblocks)
if filled_blocks < columns:
for n in range(columns - filled_blocks):
textblocks.insert(len(textblocks), [])
for i in range(columns):
textblocks[i] = ("\n").join(textblocks[i])
return textblocks[:columns]
def create_section(psize, text, layer):
run_command("convert -background none -fill "+text_color+" -border "+str(border)+\
" -bordercolor none -pointsize "+size+" -size "+psize+\
" caption:"+'"'+text+'" '+layer)
def combine_sections(layers):
run_command("convert "+image_1+" "+image_2+" "+"+append "+span_image)
pass
def set_overlay():
boxes = slice_lines(read_text(notes), n_lines, columns)
resolution = get_value('identify -format "%wx%h" '+curr_wall).split("x")
w = str(int(int(resolution[0])/columns)-2*border)
h = str(int(resolution[1])-2*border)
layers = []
for i in range(len(boxes)):
layer = curr_dir+"/"+"layer_"+str(i+1)+".png"
create_section(w+"x"+h, boxes[i], layer)
layers.append(layer)
run_command("convert "+(" ").join(layers)+" "+"+append "+curr_dir+"/"+"layer_span.png")
wall_img = curr_dir+"/"+"walltext.jpg"
run_command("convert "+curr_wall+" "+curr_dir+"/"+"layer_span.png"+" -background None -layers merge "+wall_img)
run_command("gsettings set org.gnome.desktop.background picture-uri file:///"+wall_img)
for img in [img for img in os.listdir(curr_dir) if img.startswith("layer_")]:
os.remove(curr_dir+"/"+img)
while True:
text_1 = read_text(notes)
time.sleep(5)
text_2 = read_text(notes)
if text_2 != text_1:
set_overlay()
笔记
- 可以向脚本添加更多选项,可以找到有关 Imagemagick 选项的更多信息这里。
答案2
我修改了上面的代码,每小时在壁纸上添加随机引语。尽情享受吧 :) http://forraskod.blogspot.hu/2016/01/linux-hatterkep-veletlenszeru.html
#!/usr/bin/env python3
import subprocess
import os
import time
import random
curr_dir = os.path.dirname(os.path.realpath(__file__))
curr_wall = curr_dir+"/"+"original.jpg"
notes = curr_dir+"/"+"notes.txt"
#--
text_color = "white" # text color
size = "80" # text size (real size depends on the scale factor of your wallpaper)
border = 480 # space around your text blocks
columns = 1 # (max) number of columns
n_lines = 3 # (max) number of lines per column
#--
def run_command(cmd):
subprocess.call(["/bin/bash", "-c", cmd])
def get_value(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8").strip()
def read_text(file):
with open(file) as src:
return [l.strip() for l in src.readlines()]
def slice_lines(lines, n_lines, columns):
markers = [i for i in range(len(lines)) if i % n_lines == 0]
last = len(lines); markers = markers+[last] if markers[-1] != last else markers
textblocks = [lines[markers[i]:markers[i+1]] for i in range(len(markers)-1)]
filled_blocks = len(textblocks)
if filled_blocks < columns:
for n in range(columns - filled_blocks):
textblocks.insert(len(textblocks), [])
for i in range(columns):
textblocks[i] = ("\n").join(textblocks[i])
return textblocks[:columns]
def create_section(psize, text, layer):
run_command("convert -background none -fill "+text_color+" -border "+str(border)+\
" -bordercolor none -pointsize "+size+" -size "+psize+\
" caption:"+'"'+text+'" '+layer)
def combine_sections(layers):
run_command("convert "+image_1+" "+image_2+" "+"+append "+span_image)
pass
def set_overlay(): # Read the file "notes" as specified above, display text in columns
boxes = slice_lines(read_text(notes), n_lines, columns)
resolution = get_value('identify -format "%wx%h" '+curr_wall).split("x")
w = str(int(int(resolution[0])/columns)-2*border)
h = str(int(resolution[1])-2*border)
layers = []
for i in range(len(boxes)):
layer = curr_dir+"/"+"layer_"+str(i+1)+".png"
create_section(w+"x"+h, boxes[i], layer)
layers.append(layer)
run_command("convert "+(" ").join(layers)+" "+"+append "+curr_dir+"/"+"layer_span.png")
wall_img = curr_dir+"/"+"walltext.jpg"
run_command("convert "+curr_wall+" "+curr_dir+"/"+"layer_span.png"+" -background None -layers merge "+wall_img)
run_command("gsettings set org.gnome.desktop.background picture-uri file:///"+wall_img)
for img in [img for img in os.listdir(curr_dir) if img.startswith("layer_")]:
os.remove(curr_dir+"/"+img)
def set_single_overlay(): # DEFAULT, read 1 line from "notes" file as specified above
resolution = get_value('identify -format "%wx%h" '+curr_wall).split("x")
w = str(int(int(resolution[0])/columns)-2*border)
h = str(int(resolution[1])-2*border)
layers = []
layer = curr_dir+"/"+"layer_1.png"
#print(w)
#print(h)
create_section(w+"x"+h, text_1, layer)
layers.append(layer)
run_command("convert "+(" ").join(layers)+" "+"+append "+curr_dir+"/"+"layer_span.png")
wall_img = curr_dir+"/"+"walltext.jpg"
run_command("convert "+curr_wall+" "+curr_dir+"/"+"layer_span.png"+" -background None -layers merge "+wall_img)
run_command("gsettings set org.gnome.desktop.background picture-uri file:///"+wall_img)
for img in [img for img in os.listdir(curr_dir) if img.startswith("layer_")]:
os.remove(curr_dir+"/"+img)
print("Walltext started.")
print (curr_wall)
print (notes)
while True:
text_1 = random.choice(open(notes).readlines())
print(text_1)
set_single_overlay()
time.sleep(3600)
# text_2 = read_text(notes)
# if text_2 != text_1:
# set_overlay()