2014-10-19 5 views
0

Я написал простое приложение, использующее киви. Он отлично работает на моем рабочем столе, но я хочу, чтобы он запускался на Android. Однако, когда я устанавливаю его на свой Android-телефон, он падает при запуске.Kivy app crashing на Android

Приложение транслирует на LAN, ожидая ответа. Затем любой, кто отвечает, добавляется в список и отображается на экране.

это мой код:

import kivy 
import random 
import socket 
import threading 

kivy.require('1.7.2') # replace with your current kivy version ! 

from kivy.app import App 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.properties import ObjectProperty 
from kivy.uix.button import Button 
from kivy.uix.gridlayout import GridLayout 
from functools import partial 

from multiprocessing import Process, Queue 
from time import sleep 
import socket 
import random 

CHECK_MESSAGE = "Who is alive?" 


class Communicator: 

    def requester(self): 
     address = ('<broadcast>', 54545) 

     client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) 

     string_list =[] 

     while True: 
      #print "broadcasting done by " + self.my_name 
      client_socket.sendto(CHECK_MESSAGE, address) 
      recv_data, addr = client_socket.recvfrom(2048) 

      if self.my_name == recv_data or recv_data in string_list: 
       sleep(3) 
       continue 

      string_list.append(recv_data) 
      self.callback(string_list) 
      sleep(3) 

    def replyer(self): 
     address = ('', 54545) 
     server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1) 
     server_socket.bind(address) 
     #print my_name 

     while True: 
      #print "Listening" 
      recv_data, addr = server_socket.recvfrom(2048) 
      if recv_data == CHECK_MESSAGE: 
       server_socket.sendto(self.my_name, addr) 

    def __init__(self, callback_function): 
     self.callback = callback_function 
     self.my_name = socket.gethostname() + ' ' + str(int(random.random()*10000)) 

    def start_all(self): 
     self.start_server() 
     self.start_client() 

    def start_client(self): 
     client = threading.Thread(target=self.requester) 
     client.daemon = True 
     client.start() 

    def start_server(self): 
     server = threading.Thread(target=self.replyer) 
     server.daemon = True 
     server.start() 

class Client: 
    name = '' 

    def get_name(self): 
     return self.name 

client_list =[] 



class Pong(Screen): 
    grid_l = ObjectProperty(None) 
    top_lbl = ObjectProperty(None) 
    list_of_peers = ObjectProperty(None) 

    def search_btn_pressed(self, string_list): 
     #if self.queue.qsize() > 0: 

     #print "sieze:" , self.queue.qsize() 
     grid = self.grid_l 
     grid.bind(minimum_height=grid.setter('height'), 
        minimum_width=grid.setter('width')) 

     x = random.randint(2, 5) 

     #if self.list_of_peers is not None: 
     # grid.remove_widget(self.list_of_peers) 
     self.grid_l.clear_widgets() 

     self.list_of_peers = GridLayout(cols=1, row_default_height=40, 
             row_force_default=False) 
     self.list_of_peers.bind(minimum_height=grid.setter('height'), 
           minimum_width=grid.setter('width')) 
     print(socket.gethostbyname(socket.getfqdn())) 
     for i in string_list: 
       btn1 = Button(size_hint=(1, None)) 
       btn1.text = str(i) 
       #btn1.bind(on_release=partial(self.btn1_pressed, result)) 
       self.list_of_peers.add_widget(btn1) 

     grid.add_widget(self.list_of_peers) 

    def btn1_pressed(self, result, *args): 
     new_text = result 
     self.top_lbl.text = new_text 

    def btn2_pressed(self, *args): 
     self.grid_l.clear_widgets() 
     #pass 


class PongApp(App): 

    def build(self): 

     my_app = Pong() 
     queue = Queue() 

     my_app.queue = queue 
     Communicator(my_app.search_btn_pressed).start_all() 

     return my_app 

if __name__ == '__main__': 
    App = PongApp().run() 

и pong.kv:

#:kivy 1.7.2 

<Pong>: 
    scroll_view: scrollviewID 
    top_lbl: lblID 
    grid_l: gridlayoutID 
    AnchorLayout: 
     size_hint: 1, .1 
     pos_hint: {'x': 0, 'y': .9} 
     anchor_x: 'center' 
     anchor_y: 'center' 
     Label: 
      id: lblID 
      text: 'This is the app..' 
    Button: 
     size_hint: 1, .1 
     pos_hint: {'x': 0, 'y': .8} 
     text: 'Refresh?' 
     #on_release: root.search_btn_pressed() 

    ScrollView: 
     id: scrollviewID 
     orientation: 'vertical' 
     pos_hint: {'x': 0, 'y': 0} 
     size_hint: 1, .8 
     bar_width: '8dp' 
     GridLayout: 
      id: gridlayoutID 
      cols: 1 
      size_hint: 1, None 
      row_default_height: 40 
      row_force_default: False 

я побежал "./distribute.sh -m "OpenSSL пиль kivy"" , а затем ». /build.py --dir ~/Desktop/MyProject/--package org.test.florin - имя «ShareAll» - версия 0.0.1 - перевод INTERNET debug installd «

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

Это мой первый раз с kivy (или Android по этому вопросу)

Это ADB LogCat http://pastebin.com/embed_js.php?i=28KaFM79

не знаю, почему это такой большой ..

ответ

0

I/python (16193): No main.pyo/main.py found.

Это ошибка в файле (вы можете увидеть kivy связанных линий от python или оглавлению, используя собственный синтаксис АБД для этого).

Итак ... ваш основной файл main.py? Если это так, по какой-то причине оно не включается.

+0

У меня только 1 файл (это основной файл), называемый PongApp.py (я начал с учебника на веб-сайте и пошел с тем же файлом). Для того, чтобы он работал на Android, мне нужно переименовать его в 'main.py'? (попробовал это сейчас, он не работал) –

+0

Да, главный исполняемый файл должен называться main.py. Если он не работает, опубликуйте новый журнал adb. – inclement

+1

Из того, что я могу сказать, он жалуется, что не может найти «многопроцессорность»: «I/python (27549): ImportError: Нет модуля с именем _multiprocessing. Полный журнал: http://pastebin.com/embed_js.php?i=DQgBFqUp Мне нужно вручную импортировать библиотеки, которые я использую, или упомянуть их где-нибудь? –