這是我試圖做的最小版本。這是我的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