latest debian requires venv - automatically create it and re-run itself in there

This commit is contained in:
Stefan Schmidt-Bilkenroth 2023-11-06 00:35:29 +01:00
parent b759b5f786
commit e8c0341468
2 changed files with 110 additions and 62 deletions

View file

@ -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()

View file

@ -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()