ChoiceBox aus Protokoll-Klasse anzeigen

  • Hallo zusammen


    Ich bin ziemlich neu auf diesem Gebiet und versuche einen TCP Server in python zu implementieren um den Benutzer auf gewisse Ereignisse zu informieren oder nach etwas zu fragen. Ich arbeite mit dem "reactor" und verknüpfe einen Port mit einer Protokoll-Klasse (twisted.internet.protocol).


    server.py

    Python
    from Protocol import InfoProt
    
    
    ...
    factory = Factory()
    factory.protocol = InfoProt
    listener = reactor.listenTCP(port, factory, interface = ip)
    ...



    protocol.py

    Code
    class InfoProt(Protocol):
    	def dataReceived(self, data):
    		try:
    			# Hier soll eine ChoiceBox angezeigt werden
    			???
    			# Die Antwort soll dann zurück geschickt werden
    			self.transport.write("The answer was xxx!\n") ???
    		except Exception, e:
    			print e



    Hat mir jemand einen kleinen Hinweis wie ich das am besten anstellen könnte. Für die ChoiceBox fehlt mir die "session" Referenz. Ich könnte diese natürlich über globale Objektvariablen übergeben, aber ich finde diese Variante nicht besonders schön.


    Und für die ChoiceBox müsste ich eine Callback-Methode für die Antwort verwenden. Wie bekomme ich hier die Referenz auf das Objekt "self" um die Antwort zu senden?


    Vielen Dank im voraus

    • Offizieller Beitrag

    Eigentlich ist das ganz einfach allerdings gibt es keine ChoiceBox, Messageboxen... Alternativ kannst du dir


    Du benötigst die Session, um die enigma2-Session bekommen zu können musst deine Software ein enigma2-plugin sein, wie das geht kannst du jedem bereits vorhandenen Plugin in der plugin.py sehen.
    Die Session übergibst du dann einfach im Konstruktor:




    Eine "ChoiceBox" an sich gibt es wie gesagt nicht, da würde ich einfach einen normalen Screen mit einer Liste von auswahlmöglichkeiten aufbauen.

  • Vielen Dank für die Antwort


    Mein Code ist bereits ein Plug-In und die Session habe ich auch schon und das funktioniert eigentlich sehr gut. Habe die Session jetzt so übergeben wie in deinem Code-Beispiel.


    Es gibt keine MessageBox/ChoiceBox? In meinem enigma2 Ordner sind diese jedoch vorhanden. (Screens.MessageBox, Screens.ChoiceBox, Screens.InputBox) Und sie funktionieren auch bestens, bis auf die ChoiceBox.


    Code
    class InfoProt(Protocol):
    	def showInformation(self, message):
    		self.session.open(MessageBox, str(message))   # Funktioniert
    		self.session.openWithCallback(self.answer, InputBox, title="Gib etwas ein.", windowTitle="MyInputBox")   # Funktioniert
    		self.session.openWithCallback(self.answer, ChoiceBox, title="Heute?", list=[(_("Ja"), "yes"), (_("Nein"), "no")])   # Funktioniert NICHT
    
    
    	def answer(self, ret):
    		print ret


    Alle Dialoge werden ohne Probleme angezeigt, nur bei der ChoiceBox wird die Antwort-Funktion "answer(self, rect)" NIE aufgerufen!?! Bei der InputBox funktioniert dies wunder bar.


    Irgendwelche Ideen?

    Einmal editiert, zuletzt von Swingi ()

  • Lösung:
    -------------------------------------
    Einmal drüber schlafen und alles funktioniert von selbst. :winking_face: Die oben aufgeführte Variante funktioniert also bestens.


    Danke für die Hilfe.