2014-10-19 101 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