我去了MapView-Doncumentation和Source code,但这似乎没什么帮助。
我在kv文件中创建了这个模板,以便我可以在Map中动态创建mapmarkerpopup,但是当我尝试这个时它会创建另一个小部件(这很明显,因为我在load_content方法中添加了add_widget,因为我无法做到找到任何其他方式)
这是map_data.kv文件
#:import MapSource kivy.garden.mapview.MapSource
#:import MapMarkerPopup kivy.garden.mapview.MapMarkerPopup
[MakePopup@BoxLayout]:
MapMarkerPopup:
lat: ctx.lat
lon: ctx.lon
popup_size: 400,400
Bubble:
Image:
source: ctx.image
mipmap: True
Label:
text: ctx.label
markup: True
halign: "center"
<Toolbar@BoxLayout>:
size_hint_y: None
height: '48dp'
padding: '4dp'
spacing: '4dp'
canvas:
Color:
rgba: .2, .2, .2, .6
Rectangle:
pos: self.pos
size: self.size
<Map_Data>:
Toolbar:
top: root.top
#Spinner created to select places.
Spinner:
text: "Sydney"
values: root.map_values.keys()
on_text:
if (self.text == 'France'): root.load_content()
else: pass
MapView:
id: mapview
lat: 28.89335172
lon: 76.59449171
zoom: 24
这是main.py文件
class Map_Data(BoxLayout):
....
def load_content(self):
self.add_widget(Builder.template('MakePopup', lat ='28.89335152',
lon='76.59449153', image="goku.jpg",label='label'))
这是我从上面的代码得到的输出。 我想在地图上标记。
现在我们看到mapview有一个功能&#34; add_marker&#34;但是通过这种方法我无法添加图片和标签。
if (self.text == 'Sydney'):
mapview.add_marker(MapMarkerPopup(lat=-33.8670512,lon=151.206))
else: pass
完全正常,并在地图上添加标记。
但是如何添加图像和标签即。内容???
mapview.add_marker(MapMarkerPopup(lat=-33.8670512,lon=151.206, content=???))
现在可以通过手动创建预期结果生成,如https://github.com/kivy-garden/garden.mapview/blob/master/examples/map_with_marker_popup.py
但是动态创建它呢? 任何帮助表示赞赏。
编辑1:
我也尝试过这样做。
if (self.text == 'Sydney'): mapview.add_marker(MapMarkerPopup(lat=-33.8670512,
lon=151.206,popup_size=(400,400)).add_widget(Button(text = "stackoverflow")))
else: pass
但是它显示了这个错误:
marker._layer = self
AttributeError: 'NoneType' object has no attribute '_layer'
答案 0 :(得分:3)
自从你提出这个问题已经有一段时间了,但我最近遇到了同样的问题,也许对答案有兴趣。您在其他地方指出了如何动态添加内容(https://github.com/kivy-garden/garden.mapview/issues/5),但弹出窗口出现在错误位置的问题仍然存在,您建议需要更改set_marker_position
方法。将其更改为
def set_marker_position(self, mapview, marker):
x, y = mapview.get_window_xy_from(marker.lat, marker.lon, mapview.zoom)
marker.x = int(x - marker.width * marker.anchor_x)
marker.y = int(y - marker.height * marker.anchor_y)
if isinstance(marker, MapMarkerPopup):
marker.placeholder.x = marker.x - marker.width / 2
marker.placeholder.y = marker.y + marker.height
即。添加最后三行对我来说是个窍门。