簡體   English   中英

Kivy應用在Android上崩潰

[英]Kivy app crashing on Android

我用kivy編寫了一個簡單的應用程序。 它在我的桌面上工作正常,但我希望它在Android上運行。 但是,當我將其安裝到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 --permission已安裝INTERNET調試“

這會將應用程序帶到我的手機上,但是當我啟動它時,它崩潰了。 我想念什么嗎? 不知道如何解決任何錯誤。

這是我第一次使用kivy(或Android)

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

不知道為什么這么大..

I / python(16193):找不到main.pyo /main.py。

這是文件中的錯誤(您可以通過grepping python或使用adb自己的語法來查看與kivy相關的行)。

那么...您的主文件名為main.py嗎? 如果是這樣,則由於某種原因未將其包含在內。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM