Tkinter eventloop ohne tk

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

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

cp != mv
Antworten