Kivy Launcher:应用程序因 NameError 崩溃:未定义全局名称“autoclass”
Posted
技术标签:
【中文标题】Kivy Launcher:应用程序因 NameError 崩溃:未定义全局名称“autoclass”【英文标题】:Kivy Launcher : app crash with NameError : global name 'autoclass' is not defined 【发布时间】:2021-08-05 19:11:51 【问题描述】:我的 kivy 简单通知应用程序在 android 上崩溃,在 windows 上运行良好。
我正在尝试使用 kivy、plyer 和 oscpy 模块制作一个简单的应用程序来检查 android 上服务的使用情况。 这是该应用程序的功能: 它有一个“设置”按钮,要求服务在下一分钟弹出通知 另一个按钮“停止”来停止服务。
代码如下:
main.py:
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.Serviceservicename'.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:
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 中使用:
def start_service(self):
if platform=='android':
> service=autoclass(SERVICE_NAME)
谁能告诉我为什么会发生错误以及如何解决?
【问题讨论】:
【参考方案1】:这在 Windows 上运行良好,但是当我尝试在 android 上运行它时
只有在你不在 Windows 上运行这一行的意义上它才“有效”。
问题是你导入autoclass失败,从jnius
模块导入。
【讨论】:
我避免从 jnius 模块导入它,因为我无法在我的系统上安装 pyjnius。但是经过一番搜索,我了解到我不需要显式安装 jnius。所以我在代码中使用 autoclass 之前添加了“from jnius import autoclass”。它奏效了。谢谢。以上是关于Kivy Launcher:应用程序因 NameError 崩溃:未定义全局名称“autoclass”的主要内容,如果未能解决你的问题,请参考以下文章
Kivy GUI (Python) 在尝试更新屏幕时陷入分段错误
安卓Launcher之获取手机安装的应用列表,安卓launcher