首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kivy Launcher :没有定义带有NameError的应用程序崩溃:全局名称'autoclass‘

Kivy Launcher :没有定义带有NameError的应用程序崩溃:全局名称'autoclass‘
EN

Stack Overflow用户
提问于 2021-05-16 07:39:47
回答 1查看 127关注 0票数 1

我的kivy简单通知应用程序在android上崩溃,在windows上运行良好。

我试图使用kivy、plyer和oscpy模块制作一个简单的应用程序来检查android上服务的使用情况。这款应用程序的功能如下:它有一个按钮"set“,要求服务在下一分钟弹出一个通知,另一个按钮”停止“来停止服务。

以下是代码:

main.py:

代码语言:javascript
复制
from kivy.app import App
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
import datetime
from kivy.clock import Clock
from kivy.utils import platform
from oscpy.client import OSCClient
from oscpy.server import OSCThreadServer
from plyer import notification

SERVICE_NAME = u'{packagename}.Service{servicename}'.format(
            packagename=u'org.kivy.oscservice',
            servicename=u'Pong'
)

class MyLayout(FloatLayout):
    def __init__(self,**kwargs):
        super(MyLayout,self).__init__(**kwargs)
        self.setB=Button(text="set",size_hint=(.25,.2),pos_hint={"x":.3,"y":.4})
        self.add_widget(self.setB)
        self.setB.bind(on_press=self.set)
        self.lis=[]

        self.server=None
        self.server=server=OSCThreadServer()
        server.listen(
            address=b'localhost',
            port=30002,
            default=True
        )
        server.bind(b'/message',self.passnow)
        server.bind(b'/date',self.passnow)
        self.client=OSCClient(b'localhost',3000)
        self.start_service()
        self.stop=Button(text="Stop",size_hint=(.25,.2),pos_hint={"x":.3,"y":.1})
        self.add_widget(self.stop)
        self.stop.bind(on_press=self.stop_service)

    def start_service(self):
        if platform=='android':
            service=autoclass(SERVICE_NAME)
            self.mActivity=autoclass(u'org.kivy.android.PythonActivity').mActivity
            argument=''
            service.start(self.mActivity,argument)
            self.service=service

        elif platform in ('linux','linux2','macos','win'):
            from runpy import run_path
            from threading import Thread
            self.service=Thread(
                target=run_path,
                args=['service.py'],
                kwargs={'run_name':'__main__'},
                daemon=True
            )
            self.service.start()
        else:
            raise NotImplementedError(
                "service start not implemented on this platform"
            )

    def stop_service(self):
        if self.service:
            if platform=="android":
                self.service.stop(self.mActivity)
            elif platform in ('linux','linux2','macos','win'):
                self.service.stop()
            else:
                raise NotImplementedError(
                    "service start not implemented on this platform"
                )
            self.service=None

    def set(self,button):
        time=datetime.datetime.now().strftime("%H:%M:%S")
        if int(time.split(':')[1])+1 not in self.lis:
            self.lis.append(int(time.split(':')[1])+1)
        q=[]
        for p in range(len(self.lis)):
            if self.lis[p]==60:
                self.lis[p]=0
            if self.lis[p]<=int(time.split(':')[1]) and self.lis[p]!=0:
                q.append(p)
        for p in q:
            self.lis.remove(self.lis[p])
    #    print(self.lis)
        self.client.send_message(b'/ping',list(self.lis),)

    def passnow(self,message):
        pass

class PlyerApp(App):
    def build(self):
        return MyLayout()

if __name__=="__main__":
    now=PlyerApp()
    now.run()

service.py:

代码语言:javascript
复制
import datetime

from oscpy.server import OSCThreadServer
from oscpy.client import OSCClient
from plyer import notification
from time import sleep

notiflis=[]

CLIENT = OSCClient('localhost',3002)

def ping(*args):
    lis=[k for k in args]
    global notiflis
    notiflis=lis
    print(lis)
    CLIENT.send_message(
        b'/message',[],
    )

def plyer():
    now=int(datetime.datetime.now().strftime("%H:%M:%S").split(":")[1])
    #print(now,"   ",(now in notiflis))
    if now in notiflis:
        notification.notify(
        title=str('REMINDER AT '+str(datetime.datetime.now().strftime("%H:%M:%S"))),
        message="HERE IS YOUR REMINDER",
        timeout=15
        )
        notiflis.remove(now)
    else:
        return

if __name__=="__main__":
    SERVER = OSCThreadServer()
    SERVER.listen('localhost',port=3000,default=True)
    SERVER.bind(b'/ping',ping)
    while True:
        plyer()
        sleep(.9)

这在windows上运行得很好,但是当我尝试使用Kivy Launcher在android上运行它时,它会在加载错误后崩溃:

NameError:未定义全局名称'autoclass‘

autoclass()在行中的main.py中使用:

代码语言:javascript
复制
    def start_service(self):
        if platform=='android':
>            service=autoclass(SERVICE_NAME)

有人能告诉我错误发生的原因以及如何解决吗?

EN

回答 1

Stack Overflow用户

发布于 2021-05-16 11:47:22

在windows上运行得很好,但是当我尝试在android上运行它时

它“工作”的意义上说,您没有运行这一行的窗口。

问题是您未能导入自动类,请从jnius模块导入它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67554177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档