这是我试图做的最小版本。这是我的main.py
文件:Kivy UrlRequest不触发回调
class MainScreen(Screen):
def __init__(self):
super(MainScreen, self).__init__()
self.url_input = TextInput()
self.start = Button(text='Download')
self.start.bind(on_release=partial(self.on_start_press))
self.add_widget(self.url_input)
self.add_widget(self.start)
def on_start_press(self, *args):
DownloadTask(self.url_input.text)
...
这是包含DownloadTask
我task.py文件。
class DownloadTask(object):
def __init__(self, url):
self.url = url
self._get_headers()
def _get_headers(self):
UrlRequest(url=self.url, on_success=self._on_headers_fetched, method='HEAD')
def _on_headers_fetched(self, req, resp):
self.content_length = int(req.resp_headers.get('Content-Length'))
但是on_success回调从不被调用。上线urlrequest.py
439:
if self.on_success:
func = self.on_success()
if func:
func(self, data)
func
是None
所以没有回调被调用。 weakmethod.py
中的第47行在尝试访问self.proxy
时引发ReferenceError: weakly-referenced object no longer exists
。
try:
if self.proxy:
return getattr(self.proxy, self.method_name)
except ReferenceError:
pass
return self.method
这里有什么问题?我的DownloadTask()
垃圾收集了吗?
Environemnt:Python的3.5.3,Kivy 1.10.0,MAC OS
实际上'UrlRequest._dispatch_result()'被调用。而且我不会从kivy应用上下文中调用这些代码。如果你想看,这是源。 https://github.com/eteamin/Exmoore/blob/master/models/task.py ,这是主文件https://github.com/eteamin/Exmoore/blob/master/main.py – Juggernaut
我看到。然后在[这种情况下](https://github.com/eteamin/Exmoore/blob/b01df0ce5bfab9d38849877f76e3e6e0b2127cab/main.py#L38)我相信你的*'DownloadTask' *对象被收集。 – KeyWeeUsr
另外,如果我设置一个函数而不是一个方法作为回调,该函数将被调用 – Juggernaut