screensaver basato su flusso di news
screensaver basato su flusso di news
sto cercando uno screensaver che mi mostre le news magari provenienti da un flusso RSS o Json,
Qualcuno sa se esiste?
Grazie mille della collaborazione
Andrea
-
seasonunwrap
- Prode Principiante
- Messaggi: 1
- Iscrizione: mercoledì 31 luglio 2024, 6:46
Re: screensaver basato su flusso di news
Descrizione: Un'applicazione che visualizza i feed RSS come screensaver.
Download: Puoi cercare "RSS Screensaver for Windows" su Google per trovare siti di download affidabili.
RSS Feed Screensaver (Mac):
Descrizione: Un screensaver per macOS che può visualizzare feed RSS.
Download: Puoi trovare applicazioni di screensaver RSS per Mac su siti come MacUpdate.
-
drist029ity
- Prode Principiante
- Messaggi: 1
- Iscrizione: martedì 28 luglio 2026, 13:07
- Desktop: macbook
- Distribuzione: linux
- Sesso: Maschile
Re: screensaver basato su flusso di news
Sì, esistono diverse soluzioni. Alcuni screensaver supportano feed RSS, mentre per i JSON potrebbe essere necessario uno script o un'app dedicata che recuperi i dati e li visualizzi. Dipende anche dal sistema operativo che stai utilizzando (Windows, macOS o Linux).condorbox ha scritto: ↑martedì 9 aprile 2024, 9:02Ciao
sto cercando uno screensaver che mi mostre le news magari provenienti da un flusso RSS o Json,
Qualcuno sa se esiste? PerYourHealth employee portal
Grazie mille della collaborazione
Andrea
-
LUBO-BACK
- Prode Principiante
- Messaggi: 127
- Iscrizione: mercoledì 19 gennaio 2022, 1:00
- Sesso: Maschile
Re: screensaver basato su flusso di news
Serve feedparser, io prediligo creare un env
Codice: Seleziona tutto
mkdir news_screensaver
cd news_screensaver
python3 -m venv env
source env/bin/activate
pip install PyQt6 feedparserCodice: Seleziona tutto
nano python news_screensaver.py
Codice: Seleziona tutto
import sys
import feedparser
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt6.QtCore import Qt, QTimer
from PyQt6.QtGui import QFont, QPalette, QColor
class NewsScreensaver(QWidget):
def __init__(self, rss_url):
super().__init__()
self.rss_url = rss_url
self.news_items = []
self.current_index = 0
self.last_mouse_pos = None
self.init_ui()
self.fetch_news()
# Timer 1: Cambia la notizia a schermo ogni 6 secondi
self.display_timer = QTimer(self)
self.display_timer.timeout.connect(self.update_display)
self.display_timer.start(6000)
# Timer 2: Aggiorna il feed RSS in background ogni 10 minuti (600000 ms)
self.fetch_timer = QTimer(self)
self.fetch_timer.timeout.connect(self.fetch_news)
self.fetch_timer.start(600000)
def init_ui(self):
# Imposta la finestra a schermo intero, senza bordi e sempre in primo piano
self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint)
self.showFullScreen()
# Nasconde il cursore del mouse
self.setCursor(Qt.CursorShape.BlankCursor)
# Imposta lo sfondo nero
palette = self.palette()
palette.setColor(QPalette.ColorRole.Window, QColor("black"))
self.setPalette(palette)
self.setAutoFillBackground(True)
# Configura il layout
self.layout = QVBoxLayout()
self.layout.setAlignment(Qt.AlignmentFlag.AlignCenter)
# --- Etichetta per il TITOLO ---
self.title_label = QLabel("Caricamento notizie in corso...", self)
self.title_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.title_label.setFont(QFont("Sans Serif", 40, QFont.Weight.Bold))
self.title_label.setStyleSheet("color: #FFFFFF; padding: 20px;")
self.title_label.setWordWrap(True)
self.layout.addWidget(self.title_label)
# --- Etichetta per il CONTENUTO (Summary) ---
self.content_label = QLabel("", self)
self.content_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.content_label.setFont(QFont("Sans Serif", 24, QFont.Weight.Normal))
self.content_label.setStyleSheet("color: #AAAAAA; padding: 0 100px;") # Margini per leggibilità
self.content_label.setWordWrap(True)
self.layout.addWidget(self.content_label)
self.setLayout(self.layout)
# Abilita il tracciamento del mouse
self.setMouseTracking(True)
def fetch_news(self):
"""Scarica e analizza il feed RSS, estraendo titolo e contenuto."""
try:
feed = feedparser.parse(self.rss_url)
if feed.entries:
self.news_items = []
for entry in feed.entries:
title = entry.title
# Usa getattr per evitare errori se il campo summary non esiste
summary = getattr(entry, 'summary', '')
self.news_items.append({"title": title, "summary": summary})
self.update_display()
except Exception as e:
self.news_items = [{"title": "Errore di connessione", "summary": "Impossibile caricare il feed RSS in questo momento."}]
def update_display(self):
"""Mostra la notizia successiva nella lista."""
if self.news_items:
item = self.news_items[self.current_index]
self.title_label.setText(item["title"])
# QLabel di PyQt6 formatta in automatico l'HTML di base (es. <b>, <p>) se presente nel feed
self.content_label.setText(item["summary"])
self.current_index = (self.current_index + 1) % len(self.news_items)
# --- Gestione degli eventi di uscita (Interazione dell'utente) ---
def keyPressEvent(self, event):
sys.exit(0)
def mousePressEvent(self, event):
sys.exit(0)
def mouseMoveEvent(self, event):
"""
Chiude lo screensaver se il mouse viene mosso.
Utilizza una tolleranza di 15 pixel per ignorare le micro-vibrazioni del sensore.
"""
current_pos = event.position()
if self.last_mouse_pos is None:
self.last_mouse_pos = current_pos
else:
delta = (current_pos - self.last_mouse_pos).manhattanLength()
if delta > 15:
sys.exit(0)
if __name__ == '__main__':
app = QApplication(sys.argv)
# URL del feed RSS (puoi cambiarlo con quello di un altro sito se preferisci)
rss_feed = "https://www.ansa.it/sito/ansait_rss.xml"
screensaver = NewsScreensaver(rss_feed)
sys.exit(app.exec())
e poi avviamo con
Codice: Seleziona tutto
python news_screensaver.pyNon è niente di speciale, ma è un programma carino, anche se rudimentale.
Rieditato, sotto si trovano altri spunti.
-
LUBO-BACK
- Prode Principiante
- Messaggi: 127
- Iscrizione: mercoledì 19 gennaio 2022, 1:00
- Sesso: Maschile
Re: screensaver basato su flusso di news
rss_feed = "https://www.ansa.it/sito/ansait_rss.xml"
può ovviamente essere modificata.
- wilecoyote
- Tenace Tecnocrate

- Messaggi: 17098
- Iscrizione: giovedì 20 agosto 2009, 16:21
- Desktop: Kubuntu et alii
- Distribuzione: 9.04 32bit 14/18/20/22.04 LTS 64bit
- Sesso: Maschile
- Località: Ceranesi - Ge
Re: screensaver basato su flusso di news
Ti posto la revisione, verifica che sia tutto a posto:
Serve feedparser, io prediligo creare un env.
Creiamo la directory dell'ebv:
Spostati in ella:Codice: Seleziona tutto
mkdir news_screensaver
Crea l'env:Codice: Seleziona tutto
cd news_screensaver
Attiva l'env:Codice: Seleziona tutto
python3 -m venv env
Creiamo la directory dell'env:Codice: Seleziona tutto
source env/bin/activate
Spostati in ella:Codice: Seleziona tutto
mkdir news_screensaver
Crea l'env:Codice: Seleziona tutto
cd news_screensaver
Attiva l'env:Codice: Seleziona tutto
python3 -m venv env
Installa le necessarie dipendenze:Codice: Seleziona tutto
source env/bin/activate
Crea con un'editor il file news_screensaver.py::Codice: Seleziona tutto
pip install PyQt6 feedparser
Seleziona il listato e copialo con Ctrl+C, e poi incollialo nel file con Ctrl+Maisc.+V:Codice: Seleziona tutto
nano python news_screensaver.py
Salviamo con Crtl+X e poi avviamo con:Codice: Seleziona tutto
import sys import feedparser from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout from PyQt6.QtCore import Qt, QTimer from PyQt6.QtGui import QFont, QPalette, QColor class NewsScreensaver(QWidget): def __init__(self, rss_url): super().__init__() self.rss_url = rss_url self.news_items = [] self.current_index = 0 self.last_mouse_pos = None self.init_ui() self.fetch_news() # Timer 1: Cambia la notizia a schermo ogni 6 secondi self.display_timer = QTimer(self) self.display_timer.timeout.connect(self.update_display) self.display_timer.start(6000) # Timer 2: Aggiorna il feed RSS in background ogni 10 minuti (600000 ms) self.fetch_timer = QTimer(self) self.fetch_timer.timeout.connect(self.fetch_news) self.fetch_timer.start(600000) def init_ui(self): # Imposta la finestra a schermo intero, senza bordi e sempre in primo piano self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint) self.showFullScreen() # Nasconde il cursore del mouse self.setCursor(Qt.CursorShape.BlankCursor) # Imposta lo sfondo nero palette = self.palette() palette.setColor(QPalette.ColorRole.Window, QColor("black")) self.setPalette(palette) self.setAutoFillBackground(True) # Configura il layout self.layout = QVBoxLayout() self.layout.setAlignment(Qt.AlignmentFlag.AlignCenter) # --- Etichetta per il TITOLO --- self.title_label = QLabel("Caricamento notizie in corso...", self) self.title_label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.title_label.setFont(QFont("Sans Serif", 40, QFont.Weight.Bold)) self.title_label.setStyleSheet("color: #FFFFFF; padding: 20px;") self.title_label.setWordWrap(True) self.layout.addWidget(self.title_label) # --- Etichetta per il CONTENUTO (Summary) --- self.content_label = QLabel("", self) self.content_label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.content_label.setFont(QFont("Sans Serif", 24, QFont.Weight.Normal)) self.content_label.setStyleSheet("color: #AAAAAA; padding: 0 100px;") # Margini per leggibilità self.content_label.setWordWrap(True) self.layout.addWidget(self.content_label) self.setLayout(self.layout) # Abilita il tracciamento del mouse self.setMouseTracking(True) def fetch_news(self): """Scarica e analizza il feed RSS, estraendo titolo e contenuto.""" try: feed = feedparser.parse(self.rss_url) if feed.entries: self.news_items = [] for entry in feed.entries: title = entry.title # Usa getattr per evitare errori se il campo summary non esiste summary = getattr(entry, 'summary', '') self.news_items.append({"title": title, "summary": summary}) self.update_display() except Exception as e: self.news_items = [{"title": "Errore di connessione", "summary": "Impossibile caricare il feed RSS in questo momento."}] def update_display(self): """Mostra la notizia successiva nella lista.""" if self.news_items: item = self.news_items[self.current_index] self.title_label.setText(item["title"]) # QLabel di PyQt6 formatta in automatico l'HTML di base (es. <b>, <p>) se presente nel feed self.content_label.setText(item["summary"]) self.current_index = (self.current_index + 1) % len(self.news_items) # --- Gestione degli eventi di uscita (Interazione dell'utente) --- def keyPressEvent(self, event): sys.exit(0) def mousePressEvent(self, event): sys.exit(0) def mouseMoveEvent(self, event): """ Chiude lo screensaver se il mouse viene mosso. Utilizza una tolleranza di 15 pixel per ignorare le micro-vibrazioni del sensore. """ current_pos = event.position() if self.last_mouse_pos is None: self.last_mouse_pos = current_pos else: delta = (current_pos - self.last_mouse_pos).manhattanLength() if delta > 15: sys.exit(0) if __name__ == '__main__': app = QApplication(sys.argv) # URL del feed RSS (puoi cambiarlo con quello di un altro sito se preferisci) rss_feed = "https://www.ansa.it/sito/ansait_rss.xml" screensaver = NewsScreensaver(rss_feed) sys.exit(app.exec())
Va integrato nel singolo desktop, ma python è trasveraale/cross platform.Codice: Seleziona tutto
python news_screensaver.py
Non è niente di speciale, ma è un programma carino, anche se rudimentale.
rie dipendenze:
Crea con un'editor il file news_screensaver.py::Codice: Seleziona tutto
pip install PyQt6 feedparser
Seleziona il listato e copialo con Ctrl+C, e poi incollialo nel file con Ctrl+Maisc.+V:Codice: Seleziona tutto
nano python news_screensaver.py
Salviamo con Crtl+X e poi avviamo con:Codice: Seleziona tutto
import sys import feedparser from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout from PyQt6.QtCore import Qt, QTimer from PyQt6.QtGui import QFont, QPalette, QColor class NewsScreensaver(QWidget): def __init__(self, rss_url): super().__init__() self.rss_url = rss_url self.news_items = [] self.current_index = 0 self.last_mouse_pos = None self.init_ui() self.fetch_news() # Timer 1: Cambia la notizia a schermo ogni 6 secondi self.display_timer = QTimer(self) self.display_timer.timeout.connect(self.update_display) self.display_timer.start(6000) # Timer 2: Aggiorna il feed RSS in background ogni 10 minuti (600000 ms) self.fetch_timer = QTimer(self) self.fetch_timer.timeout.connect(self.fetch_news) self.fetch_timer.start(600000) def init_ui(self): # Imposta la finestra a schermo intero, senza bordi e sempre in primo piano self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint) self.showFullScreen() # Nasconde il cursore del mouse self.setCursor(Qt.CursorShape.BlankCursor) # Imposta lo sfondo nero palette = self.palette() palette.setColor(QPalette.ColorRole.Window, QColor("black")) self.setPalette(palette) self.setAutoFillBackground(True) # Configura il layout self.layout = QVBoxLayout() self.layout.setAlignment(Qt.AlignmentFlag.AlignCenter) # --- Etichetta per il TITOLO --- self.title_label = QLabel("Caricamento notizie in corso...", self) self.title_label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.title_label.setFont(QFont("Sans Serif", 40, QFont.Weight.Bold)) self.title_label.setStyleSheet("color: #FFFFFF; padding: 20px;") self.title_label.setWordWrap(True) self.layout.addWidget(self.title_label) # --- Etichetta per il CONTENUTO (Summary) --- self.content_label = QLabel("", self) self.content_label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.content_label.setFont(QFont("Sans Serif", 24, QFont.Weight.Normal)) self.content_label.setStyleSheet("color: #AAAAAA; padding: 0 100px;") # Margini per leggibilità self.content_label.setWordWrap(True) self.layout.addWidget(self.content_label) self.setLayout(self.layout) # Abilita il tracciamento del mouse self.setMouseTracking(True) def fetch_news(self): """Scarica e analizza il feed RSS, estraendo titolo e contenuto.""" try: feed = feedparser.parse(self.rss_url) if feed.entries: self.news_items = [] for entry in feed.entries: title = entry.title # Usa getattr per evitare errori se il campo summary non esiste summary = getattr(entry, 'summary', '') self.news_items.append({"title": title, "summary": summary}) self.update_display() except Exception as e: self.news_items = [{"title": "Errore di connessione", "summary": "Impossibile caricare il feed RSS in questo momento."}] def update_display(self): """Mostra la notizia successiva nella lista.""" if self.news_items: item = self.news_items[self.current_index] self.title_label.setText(item["title"]) # QLabel di PyQt6 formatta in automatico l'HTML di base (es. <b>, <p>) se presente nel feed self.content_label.setText(item["summary"]) self.current_index = (self.current_index + 1) % len(self.news_items) # --- Gestione degli eventi di uscita (Interazione dell'utente) --- def keyPressEvent(self, event): sys.exit(0) def mousePressEvent(self, event): sys.exit(0) def mouseMoveEvent(self, event): """ Chiude lo screensaver se il mouse viene mosso. Utilizza una tolleranza di 15 pixel per ignorare le micro-vibrazioni del sensore. """ current_pos = event.position() if self.last_mouse_pos is None: self.last_mouse_pos = current_pos else: delta = (current_pos - self.last_mouse_pos).manhattanLength() if delta > 15: sys.exit(0) if __name__ == '__main__': app = QApplication(sys.argv) # URL del feed RSS (puoi cambiarlo con quello di un altro sito se preferisci) rss_feed = "https://www.ansa.it/sito/ansait_rss.xml" screensaver = NewsScreensaver(rss_feed) sys.exit(app.exec())
Va integrato nel singolo desktop, ma python è trasveraale/cross platform.Codice: Seleziona tutto
python news_screensaver.py
Non è niente di speciale, ma è un programma carino, anche se rudimentale.
Già che ci siamo spiega come integrarlo nel desktop..
:: Ciao
ACER Extensa 5635Z 2,2 Ghz cpu Celeron T3100 hdd 320 GB Ram 4 GB scheda video Intel Mobile 4
Quando una Finestra chiusa incontra un Pinguino la Finestra chiusa è una Finestra aperta.
-
LUBO-BACK
- Prode Principiante
- Messaggi: 127
- Iscrizione: mercoledì 19 gennaio 2022, 1:00
- Sesso: Maschile
Re: screensaver basato su flusso di news
Per integrarlo nel desktop dipende un po' dall'ambiente che si usa, in effetti.
Se avessi voluto fare una cosa integrata, avrei modificato lo screensaver del mio desktop, ma non sarebbe stato adattabile per ogni piattaforma.
Diciamo che, in linea di massima, la maggioranza dei desktop hanno una sezione "gestione energetica" o roba simile che consente di lanciare uno script quando il pc rimane inattivo per un certo lasso di tempo... Questo può essere un modo.
L'altro può essere quello di creare una scorciatoia da tastiera ed anche qui dipende da desktop a desktop.
Io che amo le cose più rozze, creerei un banale lanciatore da schiacciare manualmente per avviare il servizio.
Poi esisterebbero anche modi più raffinati, ma tutto dipende dall'uso che se ne fa. Personalmente preferisco che il pc, quando è inattivo, si blocchi e richieda pin o password per operare di nuovo. Con questo piccolo script non succede ed ecco perché, se mai avessi dovuto pensare ad una cosa seria, sarei andato ad editare, ad esempio in KDE Plasma, i file scritti in QML aggiungendo le stesse funzioni, ma mantenendo il blocco con pin e password.
Quello che ho brevemente pubblicato è una cosa simpatica per un uso "casalingo" che non preveda malintenzionati davanti al pc.
Magari provo a fare in modo che, toccando lo schermo o qualsiasi tasto, rimandi l'utente alla schermata di blocco,
Se davvero a qualcuno interessasse, potrei aggiungere la scelta dei feed rss. A me sembrava una cosa semplice semplice, scusate,
Solo una precisazione, per lanciare un comando di un file python che è dentro un /env , salvo dare ogni volta, all'interno della cartella
Codice: Seleziona tutto
source env/bin/activateCodice: Seleziona tutto
/home/tuoutente/news_screensaver/env/bin/python /home/tuoutente/news_screensaver/news_screensaver.py-
LUBO-BACK
- Prode Principiante
- Messaggi: 127
- Iscrizione: mercoledì 19 gennaio 2022, 1:00
- Sesso: Maschile
Re: screensaver basato su flusso di news
Codice: Seleziona tutto
import sys
import subprocess
import feedparser
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QGraphicsOpacityEffect
from PyQt6.QtCore import Qt, QTimer, QPropertyAnimation, QParallelAnimationGroup
from PyQt6.QtGui import QFont, QPalette, QColor
class NewsScreensaver(QWidget):
# Durata dell'animazione di dissolvenza in millisecondi
ANIMATION_DURATION = 1000
def __init__(self, rss_url):
super().__init__()
self.rss_url = rss_url
self.news_items = []
self.current_index = 0
self.last_mouse_pos = None
self.init_ui()
self.setup_animations()
self.fetch_news()
# Timer 1: Mostra la notizia successiva ogni 6 secondi
self.display_timer = QTimer(self)
self.display_timer.timeout.connect(self.show_next_news)
self.display_timer.start(6000)
# Timer 2: Aggiorna il feed RSS in background ogni 10 minuti (600000 ms)
self.fetch_timer = QTimer(self)
self.fetch_timer.timeout.connect(self.fetch_news)
self.fetch_timer.start(600000)
def init_ui(self):
# Finestra a schermo intero, senza bordi e sempre in primo piano
self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint)
self.showFullScreen()
self.setCursor(Qt.CursorShape.BlankCursor)
# Sfondo nero
palette = self.palette()
palette.setColor(QPalette.ColorRole.Window, QColor("black"))
self.setPalette(palette)
self.setAutoFillBackground(True)
self.layout = QVBoxLayout()
self.layout.setAlignment(Qt.AlignmentFlag.AlignCenter)
# --- Etichetta per il TITOLO ---
self.title_label = QLabel("Caricamento notizie in corso...", self)
self.title_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.title_label.setFont(QFont("Sans Serif", 40, QFont.Weight.Bold))
self.title_label.setStyleSheet("color: #FFFFFF; padding: 20px;")
self.title_label.setWordWrap(True)
self.layout.addWidget(self.title_label)
# --- Etichetta per il CONTENUTO (Summary) ---
self.content_label = QLabel("", self)
self.content_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.content_label.setFont(QFont("Sans Serif", 24, QFont.Weight.Normal))
self.content_label.setStyleSheet("color: #AAAAAA; padding: 0 100px;")
self.content_label.setWordWrap(True)
self.layout.addWidget(self.content_label)
self.setLayout(self.layout)
self.setMouseTracking(True)
def setup_animations(self):
"""Configura gli effetti di opacità e le animazioni di dissolvenza."""
# Effetti di opacità impostati a 0 (invisibili) all'avvio
self.title_opacity_effect = QGraphicsOpacityEffect(self)
self.title_label.setGraphicsEffect(self.title_opacity_effect)
self.title_opacity_effect.setOpacity(0)
self.content_opacity_effect = QGraphicsOpacityEffect(self)
self.content_label.setGraphicsEffect(self.content_opacity_effect)
self.content_opacity_effect.setOpacity(0)
# --- Animazioni Fade-Out (da 1 a 0) ---
self.title_fade_out = QPropertyAnimation(self.title_opacity_effect, b"opacity")
self.title_fade_out.setDuration(self.ANIMATION_DURATION)
self.title_fade_out.setStartValue(1)
self.title_fade_out.setEndValue(0)
self.content_fade_out = QPropertyAnimation(self.content_opacity_effect, b"opacity")
self.content_fade_out.setDuration(self.ANIMATION_DURATION)
self.content_fade_out.setStartValue(1)
self.content_fade_out.setEndValue(0)
self.fade_out_group = QParallelAnimationGroup()
self.fade_out_group.addAnimation(self.title_fade_out)
self.fade_out_group.addAnimation(self.content_fade_out)
self.fade_out_group.finished.connect(self.update_labels_and_fade_in)
# --- Animazioni Fade-In (da 0 a 1) ---
self.title_fade_in = QPropertyAnimation(self.title_opacity_effect, b"opacity")
self.title_fade_in.setDuration(self.ANIMATION_DURATION)
self.title_fade_in.setStartValue(0)
self.title_fade_in.setEndValue(1)
self.content_fade_in = QPropertyAnimation(self.content_opacity_effect, b"opacity")
self.content_fade_in.setDuration(self.ANIMATION_DURATION)
self.content_fade_in.setStartValue(0)
self.content_fade_in.setEndValue(1)
self.fade_in_group = QParallelAnimationGroup()
self.fade_in_group.addAnimation(self.title_fade_in)
self.fade_in_group.addAnimation(self.content_fade_in)
def fetch_news(self):
"""Scarica e analizza il feed RSS."""
try:
feed = feedparser.parse(self.rss_url)
if feed.entries:
self.news_items = []
for entry in feed.entries:
title = entry.title
summary = getattr(entry, 'summary', '')
self.news_items.append({"title": title, "summary": summary})
# Avvia subito la prima notizia
self.update_labels_and_fade_in(start_immediately=True)
except Exception as e:
self.news_items = [{"title": "Errore", "summary": f"Impossibile caricare il feed RSS: {e}"}]
self.update_labels_and_fade_in(start_immediately=True)
def show_next_news(self):
"""Avvia l'animazione di fade-out per preparare la notizia successiva."""
if self.news_items:
if self.fade_in_group.state() == QPropertyAnimation.State.Running:
self.fade_in_group.stop()
self.fade_out_group.start()
def update_labels_and_fade_in(self, start_immediately=False):
"""Aggiorna il testo e avvia il fade-in."""
if self.news_items:
if not start_immediately:
self.current_index = (self.current_index + 1) % len(self.news_items)
item = self.news_items[self.current_index]
self.title_label.setText(item["title"])
self.content_label.setText(item["summary"])
if self.fade_out_group.state() == QPropertyAnimation.State.Running:
self.fade_out_group.stop()
self.fade_in_group.start()
# --- Gestione Eventi e Chiusura ---
def lock_screen_and_exit(self):
"""Avvia il blocco schermo di sistema e chiude il programma."""
try:
subprocess.run(["loginctl", "lock-session"])
except Exception as e:
print(f"Errore durante il blocco dello schermo: {e}")
finally:
sys.exit(0)
def keyPressEvent(self, event):
self.lock_screen_and_exit()
def mousePressEvent(self, event):
self.lock_screen_and_exit()
def mouseMoveEvent(self, event):
current_pos = event.position()
if self.last_mouse_pos is None:
self.last_mouse_pos = current_pos
else:
delta = (current_pos - self.last_mouse_pos).manhattanLength()
if delta > 15:
self.lock_screen_and_exit()
if __name__ == '__main__':
app = QApplication(sys.argv)
# Scegli il tuo feed preferito
rss_feed = "https://www.ansa.it/sito/ansait_rss.xml"
# rss_feed = "https://www.ilsole24ore.com/rss/norme-e-tributi.xml"
screensaver = NewsScreensaver(rss_feed)
sys.exit(app.exec())-
LUBO-BACK
- Prode Principiante
- Messaggi: 127
- Iscrizione: mercoledì 19 gennaio 2022, 1:00
- Sesso: Maschile
Re: screensaver basato su flusso di news
Codice: Seleziona tutto
import sys
import subprocess
import random # Aggiunto per mescolare le notizie
import feedparser
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QGraphicsOpacityEffect
from PyQt6.QtCore import Qt, QTimer, QPropertyAnimation, QParallelAnimationGroup
from PyQt6.QtGui import QFont, QPalette, QColor
class NewsScreensaver(QWidget):
ANIMATION_DURATION = 1000
def __init__(self, rss_urls):
super().__init__()
self.rss_urls = rss_urls # Ora accetta una lista di URL
self.news_items = []
self.current_index = 0
self.last_mouse_pos = None
self.init_ui()
self.setup_animations()
self.fetch_news()
# Timer 1: Mostra la notizia successiva ogni 6 secondi
self.display_timer = QTimer(self)
self.display_timer.timeout.connect(self.show_next_news)
self.display_timer.start(6000)
# Timer 2: Aggiorna i feed RSS in background ogni 10 minuti
self.fetch_timer = QTimer(self)
self.fetch_timer.timeout.connect(self.fetch_news)
self.fetch_timer.start(600000)
def init_ui(self):
self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint)
self.showFullScreen()
self.setCursor(Qt.CursorShape.BlankCursor)
palette = self.palette()
palette.setColor(QPalette.ColorRole.Window, QColor("black"))
self.setPalette(palette)
self.setAutoFillBackground(True)
self.layout = QVBoxLayout()
self.layout.setAlignment(Qt.AlignmentFlag.AlignCenter)
# --- Etichetta per il TITOLO ---
self.title_label = QLabel("Caricamento notizie in corso...", self)
self.title_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.title_label.setFont(QFont("Sans Serif", 28, QFont.Weight.Bold))
self.title_label.setStyleSheet("color: #FFFFFF; padding: 20px 100px;")
self.title_label.setWordWrap(True)
self.layout.addWidget(self.title_label)
# --- Etichetta per il CONTENUTO (Summary) ---
self.content_label = QLabel("", self)
self.content_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.content_label.setFont(QFont("Sans Serif", 18, QFont.Weight.Normal))
self.content_label.setStyleSheet("color: #AAAAAA; padding: 0 100px;")
self.content_label.setWordWrap(True)
self.layout.addWidget(self.content_label)
self.setLayout(self.layout)
self.setMouseTracking(True)
def setup_animations(self):
self.title_opacity_effect = QGraphicsOpacityEffect(self)
self.title_label.setGraphicsEffect(self.title_opacity_effect)
self.title_opacity_effect.setOpacity(0)
self.content_opacity_effect = QGraphicsOpacityEffect(self)
self.content_label.setGraphicsEffect(self.content_opacity_effect)
self.content_opacity_effect.setOpacity(0)
# Fade-Out
self.title_fade_out = QPropertyAnimation(self.title_opacity_effect, b"opacity")
self.title_fade_out.setDuration(self.ANIMATION_DURATION)
self.title_fade_out.setStartValue(1)
self.title_fade_out.setEndValue(0)
self.content_fade_out = QPropertyAnimation(self.content_opacity_effect, b"opacity")
self.content_fade_out.setDuration(self.ANIMATION_DURATION)
self.content_fade_out.setStartValue(1)
self.content_fade_out.setEndValue(0)
self.fade_out_group = QParallelAnimationGroup()
self.fade_out_group.addAnimation(self.title_fade_out)
self.fade_out_group.addAnimation(self.content_fade_out)
self.fade_out_group.finished.connect(self.update_labels_and_fade_in)
# Fade-In
self.title_fade_in = QPropertyAnimation(self.title_opacity_effect, b"opacity")
self.title_fade_in.setDuration(self.ANIMATION_DURATION)
self.title_fade_in.setStartValue(0)
self.title_fade_in.setEndValue(1)
self.content_fade_in = QPropertyAnimation(self.content_opacity_effect, b"opacity")
self.content_fade_in.setDuration(self.ANIMATION_DURATION)
self.content_fade_in.setStartValue(0)
self.content_fade_in.setEndValue(1)
self.fade_in_group = QParallelAnimationGroup()
self.fade_in_group.addAnimation(self.title_fade_in)
self.fade_in_group.addAnimation(self.content_fade_in)
def fetch_news(self):
"""Scarica e analizza tutti i feed RSS nella lista."""
self.news_items = []
for url in self.rss_urls:
try:
feed = feedparser.parse(url)
# Cerca di estrarre il nome del sito (es. "ANSA.it")
site_name = feed.feed.title if 'title' in feed.feed else "News"
if feed.entries:
for entry in feed.entries:
# Aggiunge il nome del sito prima del titolo
title = f"[{site_name}] {entry.title}"
summary = getattr(entry, 'summary', '')
self.news_items.append({"title": title, "summary": summary})
except Exception as e:
print(f"Errore di connessione al feed {url}: {e}")
# Se sono state trovate notizie, le mescola in ordine casuale
if self.news_items:
random.shuffle(self.news_items)
self.update_labels_and_fade_in(start_immediately=True)
else:
self.news_items = [{"title": "Nessuna notizia", "summary": "Impossibile caricare i feed RSS in questo momento."}]
self.update_labels_and_fade_in(start_immediately=True)
def show_next_news(self):
if self.news_items:
if self.fade_in_group.state() == QPropertyAnimation.State.Running:
self.fade_in_group.stop()
self.fade_out_group.start()
def update_labels_and_fade_in(self, start_immediately=False):
if self.news_items:
if not start_immediately:
self.current_index = (self.current_index + 1) % len(self.news_items)
item = self.news_items[self.current_index]
self.title_label.setText(item["title"])
self.content_label.setText(item["summary"])
if self.fade_out_group.state() == QPropertyAnimation.State.Running:
self.fade_out_group.stop()
self.fade_in_group.start()
# --- Gestione Eventi e Chiusura ---
def lock_screen_and_exit(self):
try:
subprocess.run(["loginctl", "lock-session"])
except Exception as e:
print(f"Errore durante il blocco dello schermo: {e}")
finally:
sys.exit(0)
def keyPressEvent(self, event):
self.lock_screen_and_exit()
def mousePressEvent(self, event):
self.lock_screen_and_exit()
def mouseMoveEvent(self, event):
current_pos = event.position()
if self.last_mouse_pos is None:
self.last_mouse_pos = current_pos
else:
delta = (current_pos - self.last_mouse_pos).manhattanLength()
if delta > 15:
self.lock_screen_and_exit()
if __name__ == '__main__':
app = QApplication(sys.argv)
# ELENCO DEI FEED RSS: Aggiungi qui tutti i link che vuoi!
rss_feeds_list = [
"https://www.ansa.it/sito/ansait_rss.xml",
"https://www.ilsole24ore.com/rss/norme-e-tributi.xml",
"https://www.lffl.org/feed"
]
screensaver = NewsScreensaver(rss_feeds_list)
sys.exit(app.exec())-
LUBO-BACK
- Prode Principiante
- Messaggi: 127
- Iscrizione: mercoledì 19 gennaio 2022, 1:00
- Sesso: Maschile
Re: screensaver basato su flusso di news
L'ho risolta così:
- ho scaricato un'icona png e l'ho salvata in /usr/share/icons
- ho realizzato un file desktop con questo contenuto
Codice: Seleziona tutto
[Desktop Entry]
Version=alpha 3
Name=screenrss
Comment=screensavercon feed rss
Exec=/home/lucab/news_screensaver/env/bin/python /home/lucab/news_screensaver/news_screensaver.py
Terminal=false
X-MultipleArgs=false
Type=Application
Icon=/usr/share/icons/feed.png
Categories=Office;
StartupNotify=true
L'unico consiglio che posso aggiungere, poiché linux è diventato schizzinoso in merito ai file .desktop, è di andare nella cartella /usr/share/applications e di copiare un file desktop già esistente con un nuovo nome e di editare poi quello, invece di creare un nuovo file .desktop.
- wilecoyote
- Tenace Tecnocrate

- Messaggi: 17098
- Iscrizione: giovedì 20 agosto 2009, 16:21
- Desktop: Kubuntu et alii
- Distribuzione: 9.04 32bit 14/18/20/22.04 LTS 64bit
- Sesso: Maschile
- Località: Ceranesi - Ge
Re: screensaver basato su flusso di news
! dettaglio dalle Debian Policy, i file che integri nel sistema, esclusa la «Home», vanno allocati in /usr/local.
Ovvero /usr/share/icons → /usr/local/share/icons, /usr/share/applications → /usr/local/share/applications, ecc., serve a non «»sporcare il sistema ed evitare che vengano persi nell'aggiornamento.
Vale anche pelle altre directory, ovvero /etc → /usr/local/etc, ecc.
:: Ciao
ACER Extensa 5635Z 2,2 Ghz cpu Celeron T3100 hdd 320 GB Ram 4 GB scheda video Intel Mobile 4
Quando una Finestra chiusa incontra un Pinguino la Finestra chiusa è una Finestra aperta.
-
LUBO-BACK
- Prode Principiante
- Messaggi: 127
- Iscrizione: mercoledì 19 gennaio 2022, 1:00
- Sesso: Maschile
Re: screensaver basato su flusso di news
Ok, io sono un autodidatta e tendo a fare le cose come mi vengono.wilecoyote ha scritto: ↑sabato 1 agosto 2026, 21:34) Salve, troppa grazia, grazie delle integrazioni.
! dettaglio dalle Debian Policy, i file che integri nel sistema, esclusa la «Home», vanno allocati in /usr/local.
Ovvero /usr/share/icons → /usr/local/share/icons, /usr/share/applications → /usr/local/share/applications, ecc., serve a non «»sporcare il sistema ed evitare che vengano persi nell'aggiornamento.
Vale anche pelle altre directory, ovvero /etc → /usr/local/etc, ecc.
:: Ciao
Ho trovato un modo abbastanza elegante di automatizzare lo screensaver in kde plasma.
Come prima cosa, si installa questo
Codice: Seleziona tutto
sudo apt install swayidleCodice: Seleziona tutto
nano avvia_screensaver.she ci mettiamo dentro questo
Codice: Seleziona tutto
#!/bin/bash
# Uccide eventuali istanze precedenti di swayidle
killall swayidle
# Definisce il comando intelligente: esegue Python SOLO se la sessione NON è bloccata ("no")
COMANDO='if [ "$(loginctl show-session -p LockedHint --value)" = "no" ]; then /home/lucab/news_screensaver/env/bin/python /home/lucab/news_screensaver/news_screensaver.py; fi'
# Avvia swayidle passando il comando intelligente
swayidle -w timeout 30 "$COMANDO" &
Poi lo rendiamo eseguibile
Codice: Seleziona tutto
chmod +x avvia_screensaver.sh Il tempo timeout 30 può essere aumentato, l'importante è che sia un tempo inferiore a quello inserito in gestione energetica per la sospensione.
Edit: ho aggiunto un check per evitare che un errore nella password/pin riportasse allo screensaver invece che alla schermata di blocco.
-
LUBO-BACK
- Prode Principiante
- Messaggi: 127
- Iscrizione: mercoledì 19 gennaio 2022, 1:00
- Sesso: Maschile
Re: screensaver basato su flusso di news
Dovrebbe funzionare anche su gnome wayland che però è un po' più rognoso, magari qualcuno lo testi.
Su Sway, Hyprland e Wayfire, nonché su Cinnamom wayland funzionerà di sicuro perché non ci sono possibili intoppi.
Se interessa, preparo un .deb.
- wilecoyote
- Tenace Tecnocrate

- Messaggi: 17098
- Iscrizione: giovedì 20 agosto 2009, 16:21
- Desktop: Kubuntu et alii
- Distribuzione: 9.04 32bit 14/18/20/22.04 LTS 64bit
- Sesso: Maschile
- Località: Ceranesi - Ge
Re: screensaver basato su flusso di news
Non essendoci problemi d'accesso rispetto terzi la questione login non si pone.
:: Ciao
ACER Extensa 5635Z 2,2 Ghz cpu Celeron T3100 hdd 320 GB Ram 4 GB scheda video Intel Mobile 4
Quando una Finestra chiusa incontra un Pinguino la Finestra chiusa è una Finestra aperta.
-
LUBO-BACK
- Prode Principiante
- Messaggi: 127
- Iscrizione: mercoledì 19 gennaio 2022, 1:00
- Sesso: Maschile
Re: screensaver basato su flusso di news
Alla fine svolgono lo stesso ruolo.
Riflessione laterale e premesso che sono un dilettante: ogni volta che cerco di realizzare qualcosa che funzioni "generalmente" su gnu linux mi scontro con ennemila versioni etc.. Chi scrive software per android deve solo preoccuparsi di mettere le versioni compatibili nel manifest, su windows gira anche roba delle guerre puniche. Macos non lo conosco quasi per nulla e non so che dire, Però tutta questa diversificazione o frammentazione che dir si voglia non è sempre segnale di salute dell'ecosistema linux. Anche perché il kernel è arrivato a livelli pazzeschi e sono i desktop a complicare la compatibilità.
- wilecoyote
- Tenace Tecnocrate

- Messaggi: 17098
- Iscrizione: giovedì 20 agosto 2009, 16:21
- Desktop: Kubuntu et alii
- Distribuzione: 9.04 32bit 14/18/20/22.04 LTS 64bit
- Sesso: Maschile
- Località: Ceranesi - Ge
Re: screensaver basato su flusso di news
:: Ciao
ACER Extensa 5635Z 2,2 Ghz cpu Celeron T3100 hdd 320 GB Ram 4 GB scheda video Intel Mobile 4
Quando una Finestra chiusa incontra un Pinguino la Finestra chiusa è una Finestra aperta.
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 1 ospite