Проверка кармы пользователя сайта habrahabr.ru с помощью Python на Android. Часть 2 — GUI

    В первой части я рассказал как настроить Android смартфон для работы с SL4A (Scripting Layer for Android), показал как вызывать системные всплывающие окна, получать из них введенную пользователем информацию и выводить в них результат работы. В этой же части я расскажу о построении интерфейса к приложению с помощью WebViews. Если коротко, то WebViews это способ построить интерфейс приложения с помощью HTML, JavaScript и CSS. Если учесть, что в Android смартфонах полнофункциональный webkit, то построение интерфейса не такая уж и проблемная задача.

    Исходный код

    habr.py
    # -*- coding: utf-8 -*-
    
    import android, os, sys, urllib2
    from xml.etree import ElementTree
    
    def show_karma_value(value):
        return value
    
    droid = android.Android()
    droid.webViewShow(os.path.dirname(sys.argv[0]) + '/html/habr.html') # показываем программе, что её интерфейс - файл /html/habr.html
    
    while True:
      user = droid.eventWaitFor('login').result
      if user:
          droid.dialogCreateSpinnerProgress("Загрузка", "пожалуйста подождите") # создаем и показываем окно для ожидания загрузки данных
          droid.dialogShow()
          try:
              feed = urllib2.urlopen('http://habrahabr.ru/api/profile/' + user['data']) # грузим XML
              XML = ElementTree.XML(feed.read()) # парсим полученный XML
              try: # пробуем найти тег <error>
                     XML.find("error").text
                     value = 'пользователь не найден'
              except: # если тег <error> не найден, это значит что ошибки нет
                      value = XML.find("karma").text
          except:
              value = 'ошибка получения данных'
        
          droid.dialogDismiss() # прячем окно загрузки
          droid.eventPost('show_karma_value', show_karma_value(value)) # связываем нашу функцию show_karma_value с одноименным сигналом 
          droid.vibrate() # привлекаем внимание юзера короткой вибрацией         
    
    


    habr.html
    <html>
      <head>
        <title>Sensor Monitor</title>
        <style>
        	.logo{
        		text-align: center;
    			width: 110px;
    			height: 110px;
    			display: block;
    			margin: 10px auto;
    			background: url(http://habrahabr.ru/i/bg-multilogo.png) no-repeat 50% -144px;
    		}
    		#karma {
    			color: #6DA3BD;
    		}
    
        </style>
      </head>
      <body>
    		<span class="logo"></span>
    	    <form onsubmit="speak(); return false;">
    	      <label for="login">Введите %username%</label>
    	      <input type="text" id="login" />
    	      <input type="submit" value="Вперед!" />
    	    </form>
    	    <h2 id="karma" style="display: inline;" /></h2>
    	  <script>
          var droid = new Android();
          var speak = function() {
            droid.eventPost("login", document.getElementById("login").value);
          }
          
          var show_karma_value = function(data) {
          	document.getElementById("karma").innerHTML = 'Карма ' + document.getElementById("login").value + ': ' + data.data;
          }
          
          droid.registerCallback("show_karma_value", show_karma_value);
          </script>
      </body>
    </html>
    


    Разбираем исходный код

    Взаимодействие с программой осуществляется с помощью класса Android. Этот класс полностью идентичен такому же классу для Python, то есть из JS кода можно вызывать любые системные функции.
    var droid = new Android();

    Если посмотреть код файла habr.py, то можно увидеть что по сравнению с предыдущей частью в нем стало меньше кода. Это потому, что за интерфейс теперь отвечает другой файл. Общением Python программы с её интерфейсом происходит через «события»(events):
    В html файле мы регистрируем событие командой
    droid.registerCallback("show_karma_value", show_karma_value);

    В качестве первого аргумента — название события, в качестве второго аргумента — переменная, которая на это событие реагирует. Сама переменная может содержать в себе функцию, поэтому такого функционала достаточно для любых задач. Если же нам не нужно ждать ответа от программы, а только вызвать какую-то функцию или просто передать в нее данные мы используем
    droid.eventPost("login", document.getElementById("login").value);

    В программе мы ожидаем пользовательского ввода
    while True:
      user = droid.eventWaitFor('login').result
    

    И только если пользователь вызвал событие login, и передал в программу не пустое значение мы выполняем остальной код, в котором мы загружаем и разбираем информацию о карме пользователя, генерируем различные сообщение об ошибках на всякий случай. Далее в самой программе мы передаем событию html шаблона значение переменной, которая вычислялась внутри самой программы
    droid.eventPost('show_karma_value', value)
    

    Наш шаблон уже знает что делать с этими данными благодаря JS коду
    var show_karma_value = function(data) {
          	document.getElementById("karma").innerHTML = 'Карма ' + document.getElementById("login").value + ': ' + data.data;
    }
    


    Так же в программе для наглядности реализовано всплывающее окно во время загрузки и короткое вибро после окончания загрузки данных.

    Вывод

    Как вывод можно сказать что разработка программ на Python для Android дело совсем не сложное, и даже если требованием к программе является нормальный GUI — это не проблема благодаря WebViews. Ещё после первого топика стало понятно что тема хабралюдям интересна, поэтому буду стараться продолжать писать статьи.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 12

      +5
      Спасибо, интересно. Но еще Вы обещали написать как собирать это все в apk. Очень жду этого.
        0
        Да, очень интересно знать, а также насколько это практично.
          0
          Вот вот! Люди заждались зрелища:)
            0
            Все будет :)
              0
              как я понял, с моим слабым английским, то как сделать АПК сказано тут
              +3
              Благодарю, весьма познавательно. Может быть через пару месяцев скажу, что это Вы меня подтолкнули к изучению Питона ;)
              И да, ждем продолжения. А именно: как собрать это в karma.apk, как сделать виджет для рабочего стола, как захватить мир.
                –1
                можно еще на perl и php это же делать =) или еще на каком языке, который в SL4A можно подоткнуть
                0
                спасибо автору =) SL4A стоит на девайсе с момент его покупки, но чего то всё руки не дойдут, видимо пора начинать
                  –3
                  О! Значит всё-таки можно писать полноценные приложения для Android на python.
                  А как у python с производительностью? оно ведь должно быть медленнее аналогичного кода на java.
                  Или на современных гигагерцовых и в перспективе на двуядерных процессорах разница будет не сильно заметна?
                    +6
                    Оригинальный логотип придумали — глисты у робота.
                      0
                      Спасибо за статью. Нигде не смог найти в сети более-менее нормальных примеров, все было вокруг droid.makeToast() да droid.showDialog(). У вас очень хороший пример :)
                        0
                        Я правильно понимаю, что чтобы взлетело, нужно предварительно установить интерпретатор Питона, которого изначально в Андроиде нет? А как-то можно будет собрать приложение в apk, в котором сразу будет всё, что нужно (например, чтобы без дополнительной для пользователя головной боли распростронять его через Маркет)?

                        Only users with full accounts can post comments. Log in, please.