これは私がやろうとしていることの最小限のバージョンです。これは私の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
です。またself.proxy
にアクセスしようとするとweakmethod.py
の47行目が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、マック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