Seite 1 von 1

Tkinter eventloop ohne tk

Verfasst: Montag 18. Mai 2009, 13:13
von Costi
Hallo!

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