Eine Textdatei zu meinem automatisch aktualisierten Hintergrund machen?

7

Ich möchte eine "To-Do" -Liste für mein Hintergrundbild erstellen. Ich hatte gehofft, eine Textdatei schreiben, speichern und den Hintergrund jedes Mal aktualisieren zu können, wenn ich eine Datei bearbeite. Ist das möglich?

GuyfromAmsterdam
quelle
Meines Wissens ist dies keine vorhandene Funktionalität, aber es kann etwas sein, das per Skript erstellt werden kann.
MGodby

Antworten:

11

Das folgende Skript überwacht eine Textdatei, die Sie bearbeiten können. Wenn die Datei geändert wird, wird eine neue Ebene über Ihrem Hintergrundbild mit dem Text der Datei erstellt.

Optionen

Sie können definieren:

  • Textgröße
  • Textfarbe
  • Anzahl der Spalten
  • (max) Anzahl der Zeilen pro Spalte
  • Randbreite (um die Textblöcke)

Wie benutzt man

Das Skript verwendet Imagemagick. Möglicherweise müssen Sie es zuerst installieren:

sudo apt-get install imagemagick

Dann:

  • Kopieren Sie das folgende Skript in eine leere Datei und speichern Sie es unter walltext.py.
  • Bearbeiten Sie, wenn Sie bestimmte Einstellungen wünschen, die Optionen im Kopfbereich des Skripts.
  • Kopieren Sie das Hintergrundbild Ihrer Wahl in denselben Ordner und original.jpg

    benennen Sie es (genau). Hinweis: Es ist wichtig, dass die Proportionen Ihres Hintergrundbilds mit den Proportionen der Bildschirmauflösung übereinstimmen. Andernfalls wird der Text nicht richtig positioniert.
  • Erstellen Sie im selben Ordner eine leere Textdatei mit dem Namen (genau) notes.txt. Dies ist die Datei, mit der Sie Ihre ToDolist oder was auch immer Sie auf Ihrem Bildschirm haben möchten.

Führen Sie das Skript mit dem folgenden Befehl aus:

python3 /path/to/walltext.py

Beginnen Sie nun mit der Bearbeitung Ihrer Textdatei. Alle fünf Sekunden wird das Hintergrundbild bei Bedarf aktualisiert (nachdem Sie die Änderungen gespeichert haben):

Beispiele

1 Spalte, maximal 30 Zeilen pro Spalte

Geben Sie hier die Bildbeschreibung ein

2 Spalten, maximal 20 Zeilen pro Spalte

Geben Sie hier die Bildbeschreibung ein

3 Spalten, maximal 10 Zeilen pro Spalte

Geben Sie hier die Bildbeschreibung ein

Das Skript

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

Anmerkungen

  • Weitere Optionen können zum Skript hinzugefügt werden. Weitere Informationen zu den Optionen von Imagemagick finden Sie hier .
Jacob Vlijm
quelle
Dies ist perfekt für das, was ich brauche, außer einer Sache: Kann ich es so machen, dass es dies über meinen aktuellen Hintergrund tut ? dh statt bg_color = "weiß" irgendwie überlagern? Ich werde so oder so als gelöst markieren. Vielen Dank!
GuyfromAmsterdam
Danke noch einmal! Es scheint jedoch ziemlich gut zu funktionieren, wenn ich ein Apostroph (aber kein Anführungszeichen) hinzufüge, scheint es diesen Satz nicht zu erkennen und wird sich weigern, ihn zu schreiben. So: i.imgur.com/NqoU2X3.gif
GuyfromAmsterdam
Gibt es auch eine Möglichkeit, die Ausrichtung zu ändern / zwei Spalten zu erstellen? Viele Fragen, aber das ist fantastisch!
GuyfromAmsterdam
Ich hatte es noch nicht getan, aber ich tat es und es funktioniert nicht.
GuyfromAmsterdam
@GuyfromAmsterdam das 'ist einfach zu beheben, ich werde meine Antwort später am Morgen aktualisieren.
Jacob Vlijm
-1

Ich habe den obigen Code geändert, um stündlich zufällige Anführungszeichen auf das Hintergrundbild zu setzen. Viel Spaß :) 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()
Sicambria
quelle
1
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - Von der Überprüfung
Pilot6
Guter Punkt, ich werde es aktualisieren.
Sicambria