gpt4 book ai didi

python - Kivy UrlRequest不触发回调

转载 作者:行者123 更新时间:2023-12-01 02:40:22 24 4
gpt4 key购买 nike

这是我正在尝试做的事情的最小版本。这是我的 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 文件,其中包含 DownloadTask

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)

funcNone,因此不会调用回调。另外,当尝试访问 self.proxy 时,weakmethod.py 中的第 47 行会引发 ReferenceError:弱引用对象不再存在

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

最佳答案

编辑:source之后据透露,在我看来,DownloadTask 对象已被垃圾收集,因此 ThreadUrlRequest called 运行。一个WeakProxy对于不存在的对象的方法 - 因此崩溃。

<小时/>

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

然而,UrlRequest 强烈依赖于 Kivy,这是可见的 here 。它使用 Kivy Clock 。这意味着除非 Kivy 应用程序运行,否则请求将不会进一步继续,即它应该停止 on this line 。只需尝试将任何 print('something') 添加到 UrlRequest._dispatch_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())

关于python - Kivy UrlRequest不触发回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45781224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com