Kivy 简明教程
Kivy - UrlRequest
Kivy 框架中的 UrlRequest 类允许你在网络上执行异步请求,并在请求完成后获取结果。它的功能与 JavaScript 中的 XHR 对象相同。
UrlRequest 类在“kivy.network.urlrequest”模块中定义。构造函数只需求一个名为“url”的强制参数。该类继承了 Python 中线程模块中的 Thread 类。
parameters of UrlRequest constructor 是 −
-
url − 表示要调用的完整 url 字符串的字符串。
-
on_success − 从获取结果时调用的回调函数。
-
on_redirect − 如果服务器返回 Redirect 时调用的回调函数。
-
on_failure − 如果服务器返回客户端或服务器错误时调用的回调函数。
-
on_error − 如果出现错误时调用的回调函数。
-
on_progress − 将调用的回调函数,以报告下载进度。
-
on_cancel − 如果用户通过 .cancel() 方法请求取消下载操作,将调用的回调函数。
-
on_finish − 如果请求已完成,则可以调用一个其他回调函数。
-
req_body − 表示将与请求一起发送的数据的字符串。如果包含此参数,则将执行 POST。如果未包含此参数,则将发送 GET 请求。
-
req_headers − 字典,默认为 None 要添加到请求中的自定义标头。
-
chunk_size − 每个要读取块的大小,仅在已设置 on_progress 回调时使用。
-
timeout − 一个整数,如果已设置,则阻止操作将在这么多种秒后超时。
-
method − 要使用的 HTTP 方法,默认为“GET”(如果指定了正文,则为“POST”)
-
decode − 布尔值,默认为 True。如果为 False,则跳过对响应的解码。
-
debug − 布尔值,默认为 False。
-
auth − HTTPBasicAuth,默认为 None。如果设置为,请求将使用 basicauth 进行身份验证。
UrlRequest 对象的 cancel() 方法会取消当前请求,并且 on_cancel 回调将被调用。
Example
首先,我们设计一个用户界面,其中包含一个带有 httpbin.org URL 的微调器,其中包含可变参数、两个只读文本框 - 一个显示所获取 URL 的结果,第二个显示响应标头的 JSON 字符串。在此期间,放置了一个图像窗口小部件。如果 content_type 为图像类型,它将显示图像。这些窗口小部件放置在垂直 bo 布局中。
布局使用以下 kv 语言脚本构建。
#:import json json
BoxLayout:
orientation: 'vertical'
TextInput:
id: ti
hint_text: 'type url or select from dropdown'
size_hint_y: None
height: 48
multiline: False
BoxLayout:
size_hint_y: None
height: 48
Spinner:
id: spinner
text: 'select'
values:
[
'http://httpbin.org/ip',
'http://httpbin.org/headers',
'http://httpbin.org/delay/3',
'https://httpbin.org/image/png',
]
on_text: ti.text = self.text
Button:
text: 'GET'
on_press: app.fetch_content(ti.text)
size_hint_x: None
width: 50
TextInput:
readonly: True
text: app.result_text
Image:
source: app.result_image
nocache: True
TextInput
readonly: True
text: json.dumps(app.headers, indent=2)
Kivy App 类代码如下所示。它基本上会向 httpbin.org 发送不同的 HTTP 请求。httpbin.org 是一项简单的 HTTP 请求与响应服务。应用程序将 UrlRequest 的结果存储在三个字符串变量中,并在窗口小部件中显示。
当从下拉列表中选择一个 URL 并按下 GET 按钮时,它将调用 fetch_content() 方法并收集响应。
如果响应标头包含带有图像的 content_type,则图像窗口小部件将加载图像。
from kivy.lang import Builder
from kivy.app import App
from kivy.network.urlrequest import UrlRequest
from kivy.properties import NumericProperty, StringProperty, DictProperty
import json
from kivy.core.window import Window
Window.size = (720,400)
class UrlExample(App):
status = NumericProperty()
result_text = StringProperty()
result_image = StringProperty()
headers = DictProperty()
def build(self):
pass
def fetch_content(self, url):
self.cleanup()
UrlRequest(
url,
on_success=self.on_success,
on_failure=self.on_failure,
on_error=self.on_error
)
def cleanup(self):
self.result_text = ''
self.result_image = ''
self.status = 0
self.headers = {}
def on_success(self, req, result):
self.cleanup()
headers = req.resp_headers
content_type = headers.get('content-type', headers.get('Content-Type'))
if content_type.startswith('image/'):
fn = 'tmpfile.{}'.format(content_type.split('/')[1])
with open(fn, 'wb') as f:
f.write(result)
self.result_image = fn
else:
if isinstance(result, dict):
self.result_text = json.dumps(result, indent=2)
else:
self.result_text = result
self.status = req.resp_status
self.headers = headers
def on_failure(self, req, result):
self.cleanup()
self.result_text = result
self.status = req.resp_status
self.headers = req.resp_headers
def on_error(self, req, result):
self.cleanup()
self.result_text = str(result)
UrlExample().run()
Output
运行上述代码。从微调器下拉列表中选择 'http://httpbin.org/headers' 并按 GET 按钮。您应该在文本框中看到响应标头。
选择 'https://httpbin.org/image/png' URL。图像将显示如下所示。
微调器下拉列表中有一个选项是一个指向客户端 IP 地址的 URL。从列表中选择 'http://httpbin.org/ip' 。将显示 IP 地址,如下所示 −