latest debian requires venv - automatically create it and re-run itself in there
This commit is contained in:
parent
b759b5f786
commit
e8c0341468
|
@ -1,14 +1,32 @@
|
|||
#! /bin/python3
|
||||
|
||||
# import sys, shutil and osutil for file system access
|
||||
import sys
|
||||
import os
|
||||
# used to call to shutdown or vcgencmd
|
||||
import subprocess
|
||||
|
||||
#initial check if running in a virtual environment (venv)
|
||||
def createVenv():
|
||||
if sys.prefix == sys.base_prefix:
|
||||
print( "Not running in a virtual environment" )
|
||||
if not os.path.exists( "./venv/bin/python3" ):
|
||||
print( "Creating a virtual environment" )
|
||||
subprocess.check_call([sys.executable, "-m", "venv", "./venv"] )
|
||||
print( "Restart in virtual environment" )
|
||||
p=subprocess.Popen(["./venv/bin/python3", "gruene_signale.py"], start_new_session=True )
|
||||
#p.wait()
|
||||
exit()
|
||||
#print( "running in a virtual environment" )
|
||||
return
|
||||
createVenv()
|
||||
|
||||
# import VLC module used for playback of files
|
||||
import vlc
|
||||
# TKinter is used to preapre the GUI window
|
||||
import tkinter as tk
|
||||
|
||||
# import sys, shutil and osutil for file system access
|
||||
import sys
|
||||
import shutil
|
||||
import os
|
||||
import time
|
||||
# imporrt the standard to read and write config files
|
||||
import configparser
|
||||
|
@ -20,8 +38,6 @@ import operator
|
|||
import zipfile
|
||||
# used for downloading the fles from remote
|
||||
import requests
|
||||
# used to call to shutdown or vcgencmd
|
||||
import subprocess
|
||||
# used to validate image sizes to avoid crashes
|
||||
from PIL import Image
|
||||
|
||||
|
@ -697,32 +713,37 @@ class MySlideShow(tk.Toplevel):
|
|||
def GetHandle(self):
|
||||
return self.videopanel.winfo_id()
|
||||
|
||||
def main():
|
||||
readConfig()
|
||||
|
||||
try:
|
||||
slideShow = HiddenRoot()
|
||||
except Exception as e:
|
||||
if hasattr(e, 'message'):
|
||||
print(e.message)
|
||||
else:
|
||||
print(e)
|
||||
print("Es ist ein Tcl-Fehler aufgetreten. Das Skript muss im Desktop-Modus gestartet werden.")
|
||||
exit(0)
|
||||
timedEvents = WatchTime()
|
||||
timedEvents.setReceiver(slideShow)
|
||||
timedEvents.update()
|
||||
|
||||
slideShow.bind("<Escape>", lambda e: slideShow.destroy()) # exit on esc
|
||||
slideShow.bind("<Right>", lambda e: slideShow.nextMedia()) # right-arrow key for next image
|
||||
slideShow.bind("<Left>", lambda e: slideShow.previousMedia()) # left-arrow key for previous image
|
||||
slideShow.bind("U", lambda e: slideShow.window.updateMedia()) # start download of new media
|
||||
slideShow.bind("P", lambda e: slideShow.window.togglePlayback()) # toggle playback
|
||||
slideShow.bind("i", lambda e: slideShow.window.toggleInfo()) # toggle display of info widget
|
||||
|
||||
|
||||
if DEBUG_PREVIEW == 1:
|
||||
#some featurres are only availade whith DEBUG Preview enabled
|
||||
slideShow.bind("B", lambda e: slideShow.window.blankScreenOn()) # briefly test blank screen feature
|
||||
slideShow.bind("S", lambda e: slideShow.shutdown()) # schedule shutdown and exit the slideshow
|
||||
slideShow.mainloop()
|
||||
|
||||
## ENTRY POINT ##
|
||||
readConfig()
|
||||
|
||||
try:
|
||||
slideShow = HiddenRoot()
|
||||
except Exception as e:
|
||||
if hasattr(e, 'message'):
|
||||
print(e.message)
|
||||
else:
|
||||
print(e)
|
||||
print("Es ist ein Tcl-Fehler aufgetreten. Das Skript muss im Desktop-Modus gestartet werden.")
|
||||
exit(0)
|
||||
timedEvents = WatchTime()
|
||||
timedEvents.setReceiver(slideShow)
|
||||
timedEvents.update()
|
||||
|
||||
slideShow.bind("<Escape>", lambda e: slideShow.destroy()) # exit on esc
|
||||
slideShow.bind("<Right>", lambda e: slideShow.nextMedia()) # right-arrow key for next image
|
||||
slideShow.bind("<Left>", lambda e: slideShow.previousMedia()) # left-arrow key for previous image
|
||||
slideShow.bind("U", lambda e: slideShow.window.updateMedia()) # start download of new media
|
||||
slideShow.bind("P", lambda e: slideShow.window.togglePlayback()) # toggle playback
|
||||
slideShow.bind("i", lambda e: slideShow.window.toggleInfo()) # toggle display of info widget
|
||||
|
||||
|
||||
if DEBUG_PREVIEW == 1:
|
||||
#some featurres are only availade whith DEBUG Preview enabled
|
||||
slideShow.bind("B", lambda e: slideShow.window.blankScreenOn()) # briefly test blank screen feature
|
||||
slideShow.bind("S", lambda e: slideShow.shutdown()) # schedule shutdown and exit the slideshow
|
||||
slideShow.mainloop()
|
||||
if __name__ == "__main__":
|
||||
main()
|
87
setup.py
87
setup.py
|
@ -28,6 +28,7 @@ except:
|
|||
modules.append('requests')
|
||||
|
||||
master=None
|
||||
|
||||
# try:
|
||||
# import crontab
|
||||
# except:
|
||||
|
@ -315,7 +316,7 @@ def quit():
|
|||
master.destroy()
|
||||
exit(0)
|
||||
|
||||
def buildGUI_1():
|
||||
def buildGUI_1(dx, dy):
|
||||
#add button or notification if Python modules (see above) needs to be installed
|
||||
row=tk.Frame(master,bd=1,relief=tk.SUNKEN)
|
||||
lab=tk.Label(row,text="Python Module",width=30,anchor='w')
|
||||
|
@ -328,7 +329,7 @@ def buildGUI_1():
|
|||
lab.pack(side=tk.LEFT,pady=dy,padx=dx)
|
||||
obj.pack(side=tk.RIGHT,expand=tk.YES,fill=tk.X,padx=dx)
|
||||
|
||||
def buildGUI_2():
|
||||
def buildGUI_2(dx, dy):
|
||||
#add autostart checkbox
|
||||
doAutostart.set(checkAutostartfile())
|
||||
row=tk.Frame(master,bd=1,relief=tk.SUNKEN)
|
||||
|
@ -338,7 +339,7 @@ def buildGUI_2():
|
|||
lab.pack(side=tk.LEFT,pady=dy,padx=dx)
|
||||
obj.pack(side=tk.RIGHT,expand=tk.YES,fill=tk.X,padx=dx)
|
||||
|
||||
def buildGUI_3():
|
||||
def buildGUI_3(dx, dy, anyEntryCallback):
|
||||
#add entry field for local path
|
||||
row=tk.Frame(master,bd=1,relief=tk.SUNKEN)
|
||||
lab=tk.Label(row,text="lokaler Pfad",width=30,anchor='w')
|
||||
|
@ -347,7 +348,7 @@ def buildGUI_3():
|
|||
lab.pack(side=tk.LEFT,pady=dy,padx=dx)
|
||||
obj.pack(side=tk.RIGHT,expand=tk.YES,fill=tk.X,padx=dx)
|
||||
|
||||
def buildGUI_4():
|
||||
def buildGUI_4(dx, dy, anyEntryCallback):
|
||||
#add entry field for remoteURL
|
||||
row=tk.Frame(master,bd=1,relief=tk.SUNKEN)
|
||||
lab=tk.Label(row,text="Remote-URL (wenn leer: Offline-Modus)",width=30,anchor='w')
|
||||
|
@ -358,7 +359,7 @@ def buildGUI_4():
|
|||
lab.pack(side=tk.LEFT,pady=dy,padx=dx)
|
||||
obj.pack(side=tk.RIGHT,expand=tk.YES,fill=tk.X,padx=dx)
|
||||
|
||||
def buildGUI_5():
|
||||
def buildGUI_5(dx, dy):
|
||||
#add scale widget for duration
|
||||
row=tk.Frame(master,bd=1,relief=tk.SUNKEN)
|
||||
lab=tk.Label(row,text="Anzeigedauer der Bilder (Sekunden)",width=30,anchor='w')
|
||||
|
@ -367,7 +368,7 @@ def buildGUI_5():
|
|||
lab.pack(side=tk.LEFT,pady=dy,padx=dx)
|
||||
obj.pack(side=tk.RIGHT,expand=tk.YES,fill=tk.X,padx=dx)
|
||||
|
||||
def buildGUI_6():
|
||||
def buildGUI_6(dx, dy, timeEntryCallback):
|
||||
#MARK: add controls for energy savings
|
||||
row1=tk.Frame(master,bd=1,relief=tk.SUNKEN)
|
||||
row1.pack(side=tk.TOP,padx=dx,pady=dy,expand=tk.YES,fill=tk.X)
|
||||
|
@ -401,7 +402,7 @@ def buildGUI_6():
|
|||
obj2=tk.Entry(row3,name="stop",textvariable=energyStop,validate="all",validatecommand=(timeEntryCallback, '%P', '%S', "%V", "%W"))
|
||||
obj2.pack(side=tk.LEFT,fill=tk.X,padx=dx)
|
||||
|
||||
def buildGUI_7():
|
||||
def buildGUI_7(dx, dy):
|
||||
#add checkbox for Debug Preview Mode
|
||||
row=tk.Frame(master,bd=1,relief=tk.SUNKEN)
|
||||
lab=tk.Label(row,text="Debug Preview Modus",width=30,anchor='w')
|
||||
|
@ -410,7 +411,7 @@ def buildGUI_7():
|
|||
lab.pack(side=tk.LEFT,pady=dy,padx=dx)
|
||||
obj.pack(side=tk.RIGHT,expand=tk.YES,fill=tk.X,padx=dx)
|
||||
|
||||
def buildGUI_8():
|
||||
def buildGUI_8(dx, dy):
|
||||
#add buttons
|
||||
row=tk.Frame(master)
|
||||
saveButton=tk.Button(row,text="Speichern",command=save,pady=4,padx=dx)
|
||||
|
@ -419,31 +420,57 @@ def buildGUI_8():
|
|||
quitButton.pack(side=tk.RIGHT,pady=dy,padx=dx)
|
||||
row.pack(side=tk.BOTTOM)
|
||||
|
||||
def buildGUI():
|
||||
buildGUI_1()
|
||||
buildGUI_2()
|
||||
buildGUI_3()
|
||||
buildGUI_4()
|
||||
buildGUI_5()
|
||||
buildGUI_6()
|
||||
buildGUI_7()
|
||||
buildGUI_8()
|
||||
def buildGUI(dx, dy, timeEntryCallback, anyEntryCallback):
|
||||
buildGUI_1(dx, dy)
|
||||
buildGUI_2(dx, dy)
|
||||
buildGUI_3(dx, dy, anyEntryCallback)
|
||||
buildGUI_4(dx, dy, anyEntryCallback)
|
||||
buildGUI_5(dx, dy)
|
||||
buildGUI_6(dx, dy, timeEntryCallback)
|
||||
buildGUI_7(dx, dy)
|
||||
buildGUI_8(dx, dy)
|
||||
|
||||
def createVenv():
|
||||
if sys.prefix == sys.base_prefix:
|
||||
print( "Not running in a virtual environment" )
|
||||
if not os.path.exists( "./venv/bin/python3" ):
|
||||
splash = tk.Tk()
|
||||
splash.geometry("800x450+560+300")
|
||||
splash.title("einen Moment...")
|
||||
splash.overrideredirect(True)
|
||||
label = tk.Label(splash, text="Bitte ein wenig Geduld", font=("System", 32)).pack(pady=200)
|
||||
splash.update()
|
||||
print( "Create a new virtual environment" )
|
||||
subprocess.check_call([sys.executable, "-m", "venv", "./venv"] )
|
||||
splash.destroy()
|
||||
splash.update()
|
||||
print( "Restart in virtual environment" )
|
||||
p=subprocess.Popen(["./venv/bin/python3", "setup.py"], start_new_session=True )
|
||||
#p.wait()
|
||||
exit(0)
|
||||
# print( "running in a virtual environment" )
|
||||
return
|
||||
|
||||
readConfig()
|
||||
def main():
|
||||
global master, dx, dy
|
||||
createVenv()
|
||||
readConfig()
|
||||
|
||||
master.minsize(600,300)
|
||||
master.geometry("800x450+560+300")
|
||||
master.title("Einstellungen: Gruene Signale")
|
||||
master.option_add('*Dialog.msg.font', 'System 10')
|
||||
master.minsize(600,300)
|
||||
master.geometry("800x450+560+300")
|
||||
master.title("Einstellungen: Gruene Signale")
|
||||
master.option_add('*Dialog.msg.font', 'System 10')
|
||||
|
||||
#register callbacks for entry fields
|
||||
timeEntryCallback = master.register(validateTimeFields)
|
||||
anyEntryCallback = master.register(setEntryDirty)
|
||||
#register callbacks for entry fields
|
||||
timeEntryCallback = master.register(validateTimeFields)
|
||||
anyEntryCallback = master.register(setEntryDirty)
|
||||
|
||||
#fixed value for pady and padx used by pack() function
|
||||
dy=2
|
||||
dx=4
|
||||
#fixed value for pady and padx used by pack() function
|
||||
dy=2
|
||||
dx=4
|
||||
|
||||
buildGUI()
|
||||
master.mainloop()
|
||||
buildGUI(dx, dy, timeEntryCallback, anyEntryCallback)
|
||||
master.mainloop()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in a new issue