Пытается поэкспериментировать и построить класс, разрешающий использование UrlRequest, чтобы проверить, действительно ли данный URL. Оказывается, это немного сложнее, чем предполагалось!Kivy UrlRequest называется классом - методы не выполняются?
Проблема в том, что методы on_success и on_failure/errors, определенные как часть класса, никогда не вызываются. Сценарий бросает следующий вывод (на основе команд печати):
http://www.google.com
request sent
URL doesn't work
Теперь мое подозрение, что I'm получает код возврата («Нет») из метода test_connection, а не connectionSuccess или connectionFailure. Как я могу позвонить, чтобы один из последних дал ответ? Любое предложение приветствуется. Благодарю.
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.network.urlrequest import UrlRequest
class WebExplorer():
def test_connection(self, path):
self.path = path
print (self.path)
req = UrlRequest(self.path,on_failure=self.connectionFailure,on_error=self.connectionFailure,on_success=self.connectionSuccess)
print ("request sent")
def connectionSuccess(self,*args):
print ("connectionSuccess")
return 0
def connectionFailure(self,*args):
print ("connectionFailure")
return 1
class MainScreen(FloatLayout):
def __init__(self, **kwargs):
super(MainScreen, self).__init__(**kwargs)
self.address = 'http://www.google.com'
if WebExplorer().test_connection(self.address) == 0:
print ("URL works")
else:
print ("URL doesn't work")
class App(App):
def build(self):
return MainScreen()
if __name__ == "__main__":
App().run()
UPDATE 2016-09-27 Я изменил код, и я потратили часы на попытки выяснить проблему. Сначала введите код:
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.network.urlrequest import UrlRequest
class WebExplorer():
def test_connection(self, path):
self.path = path
req = UrlRequest(self.path,on_failure=self.connectionFailure,on_error=self.connectionFailure,on_success=self.connectionSuccess)
req.wait()
return (self._return_value)
def connectionSuccess(self, req, results):
print ("Success")
self._return_value = [0,results]
def connectionFailure(self, req, results):
print ("Failure")
self._return_value = [1,results]
class MainScreen(FloatLayout):
def __init__(self, **kwargs):
super(MainScreen, self).__init__(**kwargs)
self.URLtest = ['http://www.ikea.com/','https://www.google.com','https://www.sdfwrgaeh.com']
for URL in self.URLtest:
self.returnCode = WebExplorer().test_connection(URL)
if self.returnCode[0] == 0:
print ("Correct URL")
else:
print ("Wrong URL")
class App(App):
def build(self):
return MainScreen()
if __name__ == "__main__":
App().run()
Почему 3 URL? Поскольку один из них «правильный» (IKEA), один из них является перенаправлением (Google), и один из них полностью фиктивный. Оказывается, код работает только для первого. req.wait не работает, когда результат является ошибкой/ошибкой (кстати, у меня нет идеи, какая разница между этими двумя).
Итак, вопрос заключается в том, как сделать процесс req.wait сбоем, альтернативно, как выйти из класса с правильным кодом ошибки. Я считал Clock.schedule_interval периодически проверять статус, ut, поскольку методы события даже не выполняются, когда URL-адрес неверен, мне негде установить мои variales -_-
Спасибо за ваше время и за предложение использовать req.wait(). Он по-прежнему возвращает «Нет», хотя, как если бы я не ввел код. Я применил изменения, как вы предлагали, и добавил «print (« возвращаемое значение », self._return_value)« прямо перед «return self» ._return_value "метода test_connection. Он возвращает «Нет» –
(не удалось добавить к моему предыдущему комментарию). Я также попытался ввести команду sleep после req.wait(). Он по-прежнему возвращает «Нет». Документация для wait() заключается в том, что процесс возвращается к основному потоку «Этот метод предназначен для использования в основном потоке, и обратный вызов будет отправлен из того же потока, из которого вы звоните», поэтому в теории нет причин, по которым метод on_success не будет вызван, тем самым соответствующим образом устанавливая код возврата. Ошибка? –
Что такое 'req.result'? – syntonym