我想通过按下按钮改变Kivy Mapview的位置,但我得到错误信息


from kivy.graphics.context_instructions import Color
from kivy.graphics.instructions import InstructionGroup
from kivy.graphics.vertex_instructions import Line
from kivy.properties import ObjectProperty
from kivy_garden.mapview import MapView, MapMarker
from kivy.app import App
from kivy.lang import Builder
kv = '''
MyMapView:
zoom: 2
double_tap_zoom: True
id: gps
Button:
text: " [86-6] "
background_color: (1,1,1,1)
color: (0,0,0,1)
font_size: 15
size_hint: (None,None)
width: 150
height: 30
on_press: root.gpss()
'''
class MyMapView(MapView):
grp = ObjectProperty(None)

def gpss(self):
self.ids.gps.lat = 48.20753856396109 
self.ids.gps.lon = 16.372519189874197
class MapViewApp(App):
def build(self):
return Builder.load_string(kv)

MapViewApp().run()

Error

self.ids.gps.lat = 48.20753856396109 
File "kivyproperties.pyx", line 864, in kivy.properties.ObservableDict.__getattr__
AttributeError: 'super' object has no attribute '__getattr__'
[Finished in 5.0s with exit code 1]

问题是您使用的ids。kivy对象的ids是根下小部件树中对象的字典。但是您在kv中分配的唯一id是为根节点本身分配的。因此,实际上没有ids被添加到ids字典中。这就是导致错误消息的原因(ids字典为空)。但是,由于gpss()MyMapView对象的方法,因此不需要使用ids来获取对它的引用,它就是self。所以你的gpss()方法可以改为:

def gpss(self):
self.lat = 48.20753856396109
self.lon = 16.372519189874197
self.zoom = 20

您可能需要添加zoom设置之类的东西以使MapView响应

最新更新