make everything work with screen manager

This commit is contained in:
grimhilt 2023-08-01 21:24:34 +02:00
parent b32e93f2fc
commit f1b078affc
5 changed files with 88 additions and 49 deletions

View File

@ -86,3 +86,14 @@ def update(playlist_id):
return jsonify(success=True) return jsonify(success=True)
@playlist.route('/<int:playlist_id>/activate', methods=["POST"])
def activate(playlist_id):
screen_manager = ScreenManager.getInstance()
screen_manager.activate_playlist(playlist_id)
return jsonify(success=True)
@playlist.route('/<int:playlist_id>/disactivate', methods=["POST"])
def disactivate(playlist_id):
screen_manager = ScreenManager.getInstance()
screen_manager.disactivate_playlist()
return jsonify(success=True)

View File

@ -1,10 +1,11 @@
from api import create_api from api import create_api
from screen.ScreenManager import ScreenManager
api = create_api() api = create_api()
screen_manager = ScreenManager().getInstance()
if __name__ == '__main__': if __name__ == '__main__':
api.run(host="0.0.0.0", port=5500, debug=True) #api.run(host="0.0.0.0", port=5500, debug=True)
api.run(host="0.0.0.0", port=5500)

View File

@ -0,0 +1,38 @@
import tkinter as tk
from .SlideShow import SlideShow
from api.dao.Playlist import PlaylistDao
from multiprocessing import Process
def create_slideshow(files):
root = tk.Tk()
root.title("Slideshow")
SlideShow(root, files)
root.mainloop()
class ScreenManager:
__instance = None
__slideshow_process = None
@staticmethod
def getInstance():
if ScreenManager.__instance == None:
SreenManager()
return ScreenManager.__instance
def __init__(self):
if ScreenManager.__instance != None:
raise Exception("Screen manager already exists!")
else:
ScreenManager.__instance = self
def activate_playlist(self, playlist_id):
(_, files) = PlaylistDao.get_playlist(playlist_id)
self.disactivate_playlist()
x = Process(target=create_slideshow, args=(files,))
x.start()
self.__slideshow_process = x
def disactivate_playlist(self):
if self.__slideshow_process:
self.__slideshow_process.terminate()
self.__slideshow_process = None

35
src/screen/SlideShow.py Normal file
View File

@ -0,0 +1,35 @@
import tkinter as tk
from PIL import ImageTk, Image
import time
class SlideShow:
def __init__(self, root, files):
self.root = root
self.files = files
self.idx = 0
self.image_label = tk.Label(root)
self.image_label.pack()
self.image_label.pack(fill=tk.BOTH, expand=True)
self.root.after(100, self.next_file)
def next_file(self):
file = self.files[self.idx]
path = './data/' + file['name']
image = Image.open(path)
# Get root window width and height
screen_width = self.root.winfo_width()
screen_height = self.root.winfo_height()
# Resize the image to fit the screen
image = image.resize((screen_width, screen_height), Image.ANTIALIAS)
photo = ImageTk.PhotoImage(image)
self.image_label.config(image=photo)
self.image_label.image = photo
self.idx = (self.idx + 1) % len(self.files)
self.root.after(file['seconds'] * 1000, self.next_file)

View File

@ -1,46 +0,0 @@
import tkinter as tk
from PIL import ImageTk, Image
import os
import time
class SlideshowApp:
def __init__(self, root, image_paths):
self.root = root
self.paths = image_paths
self.idx = 0
self.image_label = tk.Label(root)
self.image_label.pack()
self.image_label.pack(fill=tk.BOTH, expand=True)
self.show_next_image()
def show_next_image(self):
img_path = self.paths[self.idx]
image = Image.open(img_path)
# Get root window width and height
screen_width = self.root.winfo_width()
screen_height = self.root.winfo_height()
# Resize the image to fit the screen
image = image.resize((screen_width, screen_height), Image.ANTIALIAS)
photo = ImageTk.PhotoImage(image)
self.image_label.config(image=photo)
self.image_label.image = photo
self.idx = (self.idx + 1) % len(self.paths)
self.root.after(2000, self.show_next_image)
def main():
root = tk.Tk()
root.title("Image Slideshow")
img_paths = ["./data/960x0-1053101061.jpg", "./data/my-linux-desktop-1131547615.png", "./data/glzrkk83f4621-1200x671-54057802.jpg", "./data/yjdoiycuw04lvrebijtw-605729284.jpg"]
app = SlideshowApp(root, img_paths)
root.mainloop()
if __name__ == "__main__":
main()