Python Kivy UrlRequest不';t触发器回调

Python Kivy UrlRequest不';t触发器回调,python,callback,garbage-collection,kivy,Python,Callback,Garbage Collection,Kivy,这是我尝试做的最简单的版本。这是我的main.py文件: 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(se

这是我尝试做的最简单的版本。这是我的
main.py
文件:

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)
        ...
这是我的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行引发了
ReferenceError:尝试访问
self.proxy
时,弱引用对象不再存在

try:
    if self.proxy:
        return getattr(self.proxy, self.method_name)
except ReferenceError:
    pass
return self.method
这里的问题是什么?我的
DownloadTask()
对象是否已被垃圾回收


环境:Python 3.5.3、Kivy 1.10.0、mac os

编辑:在显示后,我觉得
下载任务
对象是垃圾收集的,因此
线程
UrlRequest
a运行,用于不存在的对象的方法-因此崩溃


我不确定它是否是垃圾收集的,但是请求会创建一个守护进程
线程
,因此您不应该太在意(请随意查找)。关于它有一个很好的解释,所以它可能还没有被收集

然而,
UrlRequest
强烈依赖于Kivy,这是可见的。它使用奇维。这意味着,除非运行Kivy应用程序,否则请求不会继续,即它应该停止。只要尝试将任何
print('something')
添加到
UrlRequest.\u dispatch\u result()
中,您就会看到它被完全忽略,因为Kivy
Clock
没有计时(因此没有调用该函数)

然而,在这个示例中,实际运行的Kivy应用程序没有问题

from kivy.app import runTouchApp
from kivy.uix.widget import Widget
from kivy.network.urlrequest import UrlRequest

class My(Widget):
    def __init__(self, **kwargs):
        super(My, self).__init__(**kwargs)
        UrlRequest(
            url='http://lipsum.com/',
            on_error=lambda *args: print('error:', args),
            on_failure=lambda *args: print('fail:', args),
            on_redirect=lambda *args: print('redir:', args),
            on_success=lambda *args: print('success:', args)
        )

runTouchApp(My())

实际上
UrlRequest.\u dispatch\u result()
被调用。我不是在kivy应用程序上下文中调用此代码的。如果您想查看,这是源代码。这是我看到的主要文件。然后在中,我相信您的
DownloadTask
对象已被收集。此外,如果我将函数而不是方法设置为回调,则该函数将被调用,尝试将
DownloadTask(…)
更改为
self.task=DownloadTask(…)
并查看发生了什么。我这样做了,它不再被收集!谢谢你能详细说明一下吗?