我最近发现了Kivy并且一直在玩一些简单的例子。我在Dusty Phillips的书中修改了一些代码,在Kivy中创建应用程序,但在我的Android手机上无法获得GPS输出。我只想让代码每秒显示一次位置。这是我的main.py文件的相关部分:
class AddLocationForm(BoxLayout):
def myclock(self, *args):
try:
gps.start()
except:
self.outputs.item_strings=["", "No Location", str(random.random())]
@mainthread
def on_location(self, **kwargs):
try:
self.outputs.item_strings = ["","","", str(kwargs['lat']),"","","",str(kwargs['lon']), "","","",str(random.random())]
except:
pass
def on_status(sefl, **kwargs):
self.outputs.item_strings = ["", "","", "On status", "", "",str(random.random())]
def send_location(self):
try:
gps.configure(on_location=self.on_location, on_status=self.on_status)
Clock.schedule_interval(self.myclock, 1)
except NotImplementedError:
self.outputs.item_strings=["", "No GPS", str(random.random())]
class WeatherApp(App):
def on_pause(self):
return True
if __name__=='__main__':
WeatherApp().run()
我的KV文件是:
AddLocationForm:
<AddLocationForm>:
orientation: "vertical"
outputs: outputs_list
BoxLayout:
height: "40dp"
size_hint_y: None
Button:
text: "Start"
size_hint_x: 25
on_press: root.send_location()
Button:
text: "End"
size_hint_x: 25
ListView:
id: outputs_list
item_strings: []
该应用程序在我的桌面上运行良好,因为它会进入NotImplementedError。当我编译应用程序(使用buildozer运行buildozer android debug
来创建.apk文件)并将其安装在我的Android手机上时,它似乎首先工作了大约一分钟然后冻结而没有任何响应。一开始暂停/在后台运行似乎不是问题。例如,我可以在应用程序之间切换并返回它,它仍然输出位置。但是,经过一段时间后,该应用只会冻结...而不会多次运行send_location()
我在buildozer.specs文件中启用了访问和提交以及plyer库
答案 0 :(得分:2)
首先,您需要确保不要多次拨打gps.configure()
或gps.start()
。我必须查看plyer代码以确定这是否真的是一个问题,但它确实是一个不好的做法。通常,您应该在应用启动时调用一次(on_start
回调),然后在应用暂停(on_pause
回调)时停止,在应用恢复时重新启动(on_resume
回调)并再次停止当您的应用退出时(on_stop
回调)。我经常只是将这些来电置于on_pause
和on_resume
,然后on_start
致电on_resume
,on_stop
致电on_pause
。 gps.configure()
可能只需要被调用一次,因为它将连接事件,并且当GPS功能启动和停止时事件将开始和停止发射。
但冻结的原因可能是您的on_status
回调没有像@mainthread
这样的on_location
装饰器。将on_status
定期调用GPS_EVENT_SATELLITE_STATUS
回调。