2014-10-19 100 views
0

我用kivy編寫了一個簡單的應用。它在我的桌面上工作得很好,但我希望它能在Android上運行。但是,當我將它安裝到我的Android手機時,它在啓動時崩潰。Kivy應用在Android上崩潰

該應用程序在局域網上廣播,等待回覆。然後,誰回覆被添加到列表並顯示在屏幕上。

這是我的代碼:

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的PIL kivy「」 然後 」。 /build.py --dir〜/ Desktop/MyProject/--package org.test.florin --name 「ShareAll」--version 0.0.1 - 權限INTERNET調試安裝目錄「

This get將應用程序添加到我的手機中,但是當我啓動它時,它會崩潰。 我錯過了什麼?不知道怎麼去任何錯誤..

這是我第一次與kivy(或Android爲此事)

這是亞行logcat http://pastebin.com/embed_js.php?i=28KaFM79

不知道爲什麼,那就是大..

回答

0

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

這是你的文件(你可以看到grepping python或使用亞行自身的語法這個kivy相關的線)的錯誤。

所以......你的主文件是main.py嗎?如果是這樣,它不會因爲某些原因而被包含在內。

+0

我只有1個文件(這是主文件),名爲PongApp.py(我從網站上的教程開始,並使用相同的文件)。爲了使它在Android上工作,我需要將它重命名爲'main.py'? (剛剛嘗試過,它沒有工作) – 2014-10-19 17:49:22

+0

是的,主要的可運行文件必須稱爲main.py。如果不起作用,請發佈新的adb日誌。 – inclement 2014-10-19 18:26:04

+1

從我可以告訴它,它抱怨說,它無法找到'multiprocessing':「I/python(27549):ImportError:沒有名爲_multiprocessing模塊。完整日誌:http://pastebin.com/embed_js.php?i=DQgBFqUp 。我需要手動導入我正在使用的庫,或者將它們提到某處嗎? – 2014-10-19 18:42:35