Tornar um arquivo de texto meu fundo atualizado automaticamente?

7

Eu quero fazer uma lista de "tarefas" no meu papel de parede. Eu esperava poder gravar um arquivo de texto, salvá-lo e fazer com que o plano de fundo fosse atualizado sempre que eu editasse o arquivo. Isso é possível?

    
por GuyfromAmsterdam 04.12.2014 / 21:44

2 respostas

10

O script abaixo assiste a um arquivo de texto que você pode editar. Se o arquivo for alterado, ele criará uma nova camada sobre o papel de parede com o texto do arquivo.

Opções

você pode definir:

  • tamanho do texto
  • cor do texto
  • número de colunas
  • (max) número de linhas por coluna
  • largura da borda (ao redor dos blocos de texto)

Como usar

O script usa o Imagemagick, você pode ter que instalá-lo primeiro:

sudo apt-get install imagemagick

Então:

  • Copie o script abaixo em um arquivo vazio e salve-o como walltext.py .
  • Editar, se você quiser configurações específicas, as opções na seção principal do script.
  • Na mesma pasta , copie o papel de parede de sua escolha, nomeie-o (exatamente) original.jpg

    NB- É importante que as proporções do seu papel de parede correspondam às proporções da sua tela resolução, senão o texto não será posicionado corretamente.
  • Na mesma pasta , crie um arquivo de texto vazio chamado (exatamente) notes.txt. Este é o arquivo para fazer seu cotidiano ou o que você gostaria de ter em sua tela.

Execute o script pelo comando:

python3 /path/to/walltext.py

Agora comece a editar seu arquivo de texto. A cada cinco segundos, o papel de parede é atualizado, se necessário (depois que você salvou as alterações):

Exemplos

1 coluna, com um máximo de 30 linhas por coluna

2colunas,comummáximode20linhasporcoluna

3 colunas, com um máximo de 10 linhas por coluna

Oscript

#!/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()

Notas

  • Mais opções podem ser adicionadas ao script, mais informações sobre as opções do Imagemagick podem ser encontradas aqui .
por Jacob Vlijm 04.12.2014 / 23:48
-1

Eu modifiquei o código acima para colocar cotações aleatórias no papel de parede a cada hora. Apreciar :) link

#!/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()
    
por Sicambria 24.01.2016 / 21:11