我的kivy简单通知应用程序在android上崩溃,在windows上运行良好。
我试图使用kivy、plyer和oscpy模块制作一个简单的应用程序来检查android上服务的使用情况。这款应用程序的功能如下:它有一个按钮"set“,要求服务在下一分钟弹出一个通知,另一个按钮”停止“来停止服务。
以下是代码:
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}.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:
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)有人能告诉我错误发生的原因以及如何解决吗?
发布于 2021-05-16 11:47:22
在windows上运行得很好,但是当我尝试在android上运行它时
它“工作”的意义上说,您没有运行这一行的窗口。
问题是您未能导入自动类,请从jnius模块导入它。
https://stackoverflow.com/questions/67554177
复制相似问题