【发布时间】: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}.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)
谁能告诉我为什么会发生错误以及如何解决?
【问题讨论】:
标签: python android notifications kivy