Hmm, I'm wondering whether this could be specific to the reactor I'm using (a _threadedselect reactor embedded in Kivy). I wrote up a minimal example of what I'm doing to demonstrate the issue, but this example works! Doesn't in my (admittedly quite a bit more complex) kivy example though. Let me try for a minimal example there and see if I can figure it out.
from twisted.internet import reactor, protocol from twisted.internet.task import deferLater from twisted.protocols import amp from ampserver import Sum, Divide connection = None class MathClient(amp.AMP): def connectionMade(self): global connection connection = self class MathFactory(protocol.ReconnectingClientFactory): protocol = MathClient if __name__ == '__main__': reactor.connectTCP('127.0.0.1', 1234, MathFactory()) def simpleSum(): global connection d = connection.callRemote(Sum, a=1, b=5) def prin(result): print(result) d.addCallback(prin) return d deferLater(reactor, 1, simpleSum) deferLater(reactor, 3, simpleSum) deferLater(reactor, 6, simpleSum) deferLater(reactor, 9, simpleSum) deferLater(reactor, 12, simpleSum) deferLater(reactor, 15, simpleSum) deferLater(reactor, 18, simpleSum).addCallback(lambda _: reactor.stop()) reactor.run() On Thu, Oct 29, 2015 at 3:37 PM, Oon-Ee Ng <ngoonee.t...@gmail.com> wrote: > Thanks David, but when I do something along the lines of:- > > def mycall(in): > print(in) > d = self.connection.boxReceiver.callRemote(Command, a='test') > d.addCallBack(mycall) > > The print never actually happens. I'm not really sure why, it was one > of the first things I tried. I tried the most basic thing, modifying > the doMath() example, and mycall only triggers when the reactor stops > (even if I run doMath multiple times with delays). > > On Thu, Oct 29, 2015 at 1:15 PM, David Ripton <drip...@ripton.net> wrote: >> On 10/28/2015 02:24 AM, Oon-Ee Ng wrote: >>> Working off the example ampserver.py and ampclient.py examples, I >>> wanted to build a client which maintains a single connection while >>> allowing the passing of messages back and forth. However I'm stuck at >>> one of the most basic steps, getting back the result (without >>> 'completing' the connection). >>> >>> The ampclient.py example simply connects, does a callRemote on the >>> resulting protocol, and adds callbacks to extract the result from a >>> dictionary and print it. The deferred being used in this case is >>> produced by connectProtocol. >>> >>> I'm trying to write a client (inheriting from amp.AMP) which is >>> embedded in a kivy GUI, something which is quite possible using the >>> _threadedselect reactor. >>> >>> On connection, I use the connectionMade method to save the 'self' (in >>> this case, the client inheriting from amp.AMP) in my kivy app. I can >>> then call a function which does a callRemote on this saved client, >>> which indeed triggers the server appropriately. >>> >>> The callRemote returns a deferred (from reading docs online, a remote >>> reference). I can't figure out what to do with it, specifically in >>> terms of getting the result ('total', when calling Sum from >>> ampserver.py). >>> >>> Assistance much appreciated. >> >> Basically, callRemote returns a deferred, that you can add callbacks and >> errbacks to, which will be called when the remote call succeeds or >> fails. On success, the callback will receive an argument equal to the >> return value of the remote callable that you called. On failure, the >> errback will receive an error argument. >> >> I have an old GUI (PyGTK, not Kivy) chat over AMP example at >> https://github.com/dripton/ampchat that might help you. (Though I think >> all of my commands return boring responses.) >> >> -- >> David Ripton drip...@ripton.net >> >> _______________________________________________ >> Twisted-Python mailing list >> Twisted-Python@twistedmatrix.com >> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python _______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python