Главная » 2016 » Май » 24 » Как создать приложение в Kivy с обращением к веб узлу(адресу)
13:53
Как создать приложение в Kivy с обращением к веб узлу(адресу)

 

Материал на котором основана статья взят с блога и оригинал текста  в полном объеме можно найти по ссылке:

http://alex-ln.wix.com/python#!Kivy-python-%D1%83%D1%80%D0%BE%D0%BA-0/cmbz/56155c5b0cf27d786fdbcf33

После успешной установки пакета kivy,начинаем изучать его функционал.

Начальный модуль для всех наших проектов должен быть назван main.py, чтобы в дальнейшем можно было запускать наши программы на мобильных платформах. Давайте добавим немного кода в наш main.py:

from kivy.app import App  # импортируем класс App

App().run()  # создаем экземпляр класса и запускаем его методом .run()

Результат:

Выскочит окно с черным фоном

from kivy.app import App

class WeatherApp(App):  # создаем подкласс класса App с именем WeatherApp (на протяжении уроков мы будем разрабатывать приложение связанное с погодой, это его начало)

    pass

if __name__ = '__main__':  # думаю понятно, при запуске модуля создается экземпляр

    WeatherApp().run()

Результат:

Тоже самое окно

В kivy есть такое чудо как KV язык (kvlang) который обеспечивает простой синтаксис разметки, на примерах будет понятнее, что все это значит, а пока создаем файл с разрешением .kv в той же папке, что и main.py с именем нашего подкласса, только в нижнем регистре и без App приписки, то есть weather.kv.

Код в wether.kv:

Label:  # создает объект Label (метка)

    text: 'Hello World'  # устанавливает св-во text

Результат:

После запуска main.py

 

 

Это начало статьи на которую я буду опираться по изучению основ фреймворка Киви и созданию видео.

 

Теперь приведу код основного файла (обратите внимание на отличие с оригиналом "==" , а не "=" в if __name__ == '__main__':

Для новичков эта опечатка автора может создать трудность при запуске файла.

from kivy.app import App
from kivy.uix.listview import ListView


class WeatherApp(App):

    pass

if __name__ == '__main__':

    WeatherApp().run()

 

Файл с расширением .kv:

AddLocationForm:
<AddLocationForm@BoxLayout>:

    orientation: 'vertical'

    BoxLayout:

        height: '40dp'  # dp - пикселей дисплея, значит, что TextInput и 2 Button будут тоже это размера по высоте

        size_hint_y: None

        TextInput:

            size_hint_x: 50  # забирает половину размера BoxLayout по горизонтали

        Button:

            text: 'Search'

            size_hint_x: 25

        Button:

            text: 'Current Location'

            size_hint_x: 25

    ListView:

        item_strings: 'Palo Alto, MX', 'Palo Alto, US'

Данный код запустит окно описание которого хорошо описано у автора, мы лишь должны обратить внимание как формируются виджеты в файле "кв" - очень важно соблюдать подчинение и вхождение элементов виджетов, то есть соблюдение отступов.

BoxLayout и ListView -  основные элементы нашего приложения и расположены в вертикальном порядке с разделением: BoxLayout ранимает 40рх, а всё оставшееся место ListView.

BoxLayout в свою очередь имеет текстовое поле ввода TextInput и две кнопки с текстовыми значениями. Эти виджеты распологаются по горизонтали и процентное деление пространства для этих трех элементов задаётся параметром size_hint_x.

 

Вывод текста в командную строку по нажатию на кнопку 'Search' из поля TextInput

Описание автора (первоисточника) я не могу превзойти, поэтому дальше привожу рабочий код приложения:

главный файл:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty

class AddLocationForm(BoxLayout):
    search_input = ObjectProperty()
    def search_location(self):
        print(self.search_input.text)

class WeatherApp(App):
    pass

if __name__ == '__main__':
    WeatherApp().run()

Файл кв:

AddLocationForm:
<AddLocationForm>:
    search_input: search_box
    orientation: 'vertical'
    BoxLayout:
        size_hint_y: None
        height:'35dp'
        
        TextInput:
            id: search_box
            size_hint_x: 50

        Button:
            size_hint_x: 25
            text: 'Search'
            on_press: root.search_location()

        Button:
            size_hint_x: 25
            text: 'Current location'

    ListView:
        item_string: []

Обратите внимание на отступы ибо если вы скопируете код файла кв с первоисточника внешний вид вашего приложения сильно исказиться...

И так окончательный код приложения с обращением к веб узлу(адресу)

основной файл:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.network.urlrequest import UrlRequest

class AddLocationForm(BoxLayout):
    search_results = ObjectProperty()
    def search_location(self):
        print(self.search_input.text)
    def search_location(self):
        search_url = 'http://api.openweathermap.org/data/2.5/find?q={}&units=metric&appid=fc8fe51064d68f6e028343378ed03c3f'.format(self.search_input.text)  # запрос к API

        request = UrlRequest(search_url, self.found_location)  # в киви есть пакет работающий с сетью (from kivy.network.urlrequest import UrlRequest) в нем есть класс UrlRequest, который отправляет запросы и принимает ответы, первым параметром передается адрес, вторым метод, который будет вызываться после получения ответа, в этот метод будут переданы два аргумента: сам объект и полученный ответ
    def found_location(self, request, data):
        cities = ['{}({})'.format(d['name'], d['sys']['country'])for d in data['list']]  # обработка ответа API, тут, ответ от сайта приходит в формате json,  UrlRequest возращает ответ как словарь, по этой причине мы не создавали json объект

        self.search_results.item_strings = cities  # добавляем в объект ListView

class WeatherApp(App):
    pass

if __name__ == '__main__':

    WeatherApp().run()

файл кв:

AddLocationForm:
<AddLocationForm>:
    search_input: search_box
    search_results: search_results_list
    orientation: 'vertical'
    
    BoxLayout:
        size_hint_y: None
        height:'35dp'
        
        TextInput:
            id: search_box
            size_hint_x: 50

        Button:
            size_hint_x: 25
            text: 'Search'
            on_press: root.search_location()

        Button:
            size_hint_x: 25
            text: 'Current location'

    ListView:
        id: search_results_list
        item_string: []

 

 

Категория: Kivy | Просмотров: 2436 | Добавил: kuzma | Рейтинг: 1.0/1
Всего комментариев: 0
avatar

Программирование игр на Python

Django - создание сайтов с нуля

Javascript - просто используем готовые решения