我用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
不知道爲什麼,那就是大..
我只有1個文件(這是主文件),名爲PongApp.py(我從網站上的教程開始,並使用相同的文件)。爲了使它在Android上工作,我需要將它重命名爲'main.py'? (剛剛嘗試過,它沒有工作) – 2014-10-19 17:49:22
是的,主要的可運行文件必須稱爲main.py。如果不起作用,請發佈新的adb日誌。 – inclement 2014-10-19 18:26:04
從我可以告訴它,它抱怨說,它無法找到'multiprocessing':「I/python(27549):ImportError:沒有名爲_multiprocessing模塊。完整日誌:http://pastebin.com/embed_js.php?i=DQgBFqUp 。我需要手動導入我正在使用的庫,或者將它們提到某處嗎? – 2014-10-19 18:42:35