Ich versuche Tcls http modul ueber python zu benutzen.
(vorteil: asynchrone http requests ohne twisted oder andere 3. party module)
aber leider werden anscheinend events im tcl mainloop nur "gehandelt", wenn der tcl interpreter (_tkinter.create) mit tk (useTk=1) gestartet wurde ansonsten hilft weder .mainloop noch der tcl befehl "vwait forever"
irgendwelche ideen?
danke!
Code: Alles auswählen
import random
import _tkinter
from tkinter import Tk
#tcl = _tkinter.create(None, 'basename', 'Tk', 0, 1, 0, 0, None)
class HTTPResponse():
def __init__(self, tcl, token):
self._token = token
self._tcl = tcl
def get(self, attr):
#tcl.eval('upvar #0 $token state')
return self._tcl.call('::http::'+str(attr), self._token)
class HTTP():
def __init__(self, tcl):
self.tcl = tcl
self.tcl.call('package', 'require', 'http')
self._uids = set()
def _mk_uid(self):
uid = '_'.join(str(i) for i in random.sample(range(10000), 6))
if uid in self._uids:
return self._mk_uid()
self._uids.add(uid)
return uid
def geturl(self, url, response_cb):
uid = self._mk_uid()
cmd_name = 'on_resp_'+uid
def cb(token):
tcl.deletecommand(cmd_name)
resp_obj = HTTPResponse(self.tcl, token)
response_cb(resp_obj)
self.tcl.createcommand(cmd_name, cb)
self.tcl.call('::http::geturl', url, '-command', cmd_name)
def loop(self):
self.tcl.mainloop()
#self.tcl.call('vwait', 'forever')
def update(self):
self.tcl.update()
tcl = Tk(useTk=1)
tcl.withdraw()
http = HTTP(tcl)
for i in range(10):
print(i)
def cb(resp):
print(resp.get('status'))
print(resp.get('data'))
http.geturl('http://google.com', cb)
http.loop()