Hallo Sebastian,
ich bin momentan dabei ein kleines Script für das Mediencenter XBMC zu schreiben. Dieses soll nach Ablauf eines Timers verschiedene Aktionen wie z.B ein Fernseher ausschalten, Nas ausschalten, XBMC beenden, den Ruhezustand des Computers einleiten etc. Hierfür werden einfach verschiedene Konsolenbefehle abgesetzt.
Ein paar Anmerkungen zur Arbeitsweise des Scripts:
- Passwort abfragen, welches später für ein ext. Programm gebarucht wird (damit dieses nicht in Klartext im Quellcode steht) [Password]
- Zahlenblock zur Eingabe der Wartezeit öffnen [Password]
- Timer starten [StartTimer]
- Eine Minute vor Ablauf eine Warnung anzeigen (mit Möglichkeit zum Abbruch des Timers, Dauer 1 min) [LastWarning] [CancelActions]
- Nach Ablauf der Minute die Aktionen ausführen [Start Actions]
Ob der Quelltext jetzt gut oder schlecht ist, sei mal dahin gestellt. Hauptsache es funktioniert
Leider sind meine Python Kenntnisse nicht sonderlich fundiert.
Das Problem besteht nun bei dem Abbruch des laufenden Timers von def StartTimer. Der Zahlenblock (self.StartTimer(dialog.numeric(0, 'Zeit in min', '')) in def Password soll Übergabe eines leeren Strings (keine Zeiteingabe) den Timer abbrechen.
Beispiel:
-Ich rufe das Script auf
-Eine Instanz der Klasse wird ezeugt, das komplette Skript durchlaufen und der Timer arbeitet in XBMC im Hintergrund
-Nun möchte ich beispielsweise den Timer abbrechen (also das script erneut starten)
-Dazu müsste ich ja die bereits erzeugte Instanz wieder aufrufen, einen leeren String mit dem Nummernblock übergeben und die Methode def CancelTimer aufrufen
Hier stehe ich grade irgendwie auf dem Schlauch. Die alte Instanz wieder aufrufen und erst beim Durchlaufen von def CancelActions die Instanz zerstören.
?????
Geht das irgendwie oder ist das alles Banane?
Schönen Gruß
4lb3rtO
Hier noch ein paar Infos zu XBMC
http://wiki.xbmc.org/index.php?title=HO ... text_label
http://xbmc.sourceforge.net/python-docs/
Code: Alles auswählen
import xbmc, xbmcgui, os, time, datetime, threading, hashlib
class MyClass(xbmcgui.WindowDialog):
pwd = ''
def __init__(self):
dialog = xbmcgui.Dialog()
keyboard = xbmc.Keyboard()
keyboard.setHiddenInput(True)
keyboard.setHeading('Passwort eingeben')
keyboard.doModal()
if (keyboard.isConfirmed()):
self.pwd = keyboard.getText()
self.Password(self.pwd)
def Password(self, Passwort):
#Passwort: pw
pwhash = 'be196838736ddfd0007dd8b2e8f46f22d440d4c5959925cb49135abc9cdb01e84961aa43dd0ddb6ee59975eb649280d9f44088840af37451828a6412b9b574fc'
pw = hashlib.sha512(Passwort)
dialog = xbmcgui.Dialog()
if pwhash == pw.hexdigest():
#dialog.ok("Passwort", "Zugriff erlaubt")
try:
self.StartTimer(dialog.numeric(0, 'Zeit in min', ''))
except:
#dialog.ok("Passwort", "Eingabe abgebrochen")
exit
else:
dialog.ok("Passwort", "Falsches Passwort. Zugriff verweigert")
def StartTimer(self, Dauer):
if Dauer == '':
self.CancelActions()
else:
self.t1 = datetime.datetime.now()
self.timer = threading.Timer((int(Dauer)-1)*60, self.LastWarning, [self.t1])
self.timer.start()
def LastWarning(self, Dauer):
self.t1 = datetime.datetime.now()
self.Thread = threading.Thread(target = self.CancelDialog)
self.Thread.start()
self.timer = threading.Timer(60, self.StartActions, [self.t1])
self.timer.start()
def CancelDialog(self):
dialog = xbmcgui.Dialog()
if dialog.yesno("Achtung", "Ruhezustand in 1 min! Beenden abbrechen?"):
self.CancelActions()
def StartActions(self, Startzeitpunkt):
dialog = xbmcgui.Dialog()
dialog.ok("Timer", "Timer ist abgelaufen")
#os.system('Pfad zur exe -PARAMETER')
#time.sleep(10)
#os.system('Pfad zur exe + PARAMETER + self.pwd + ' PARAMETER')
#time.sleep(10)
#os.system('shutdown -h')
#xbmc.shutdown()
def CancelActions(self):
dialog = xbmcgui.Dialog()
try:
self.timer.cancel()
dialog.ok("CancelActions Try", "Timer abgebrochen")
#del self ################## ??
except:
dialog.ok("CancelActions Except", "Timer konnte nicht abgebrochen werden")
exit
mydisplay = MyClass()
#del mydisplay