在kivy-Garden-Mapview中的python端(不在kv文件中)的MapMarkerPopup中创建Popup

时间:2015-06-16 08:44:55

标签: python maps kivy

我去了MapView-DoncumentationSource 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'))

这是我从上面的代码得到的输出。 我想在地图上标记enter image description here

现在我们看到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'

1 个答案:

答案 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

即。添加最后三行对我来说是个窍门。