在 kivy-Garden-Mapview 的 python 侧(不在 kv 文件中)的 MapMarkerPopup 中创建弹出窗口

Create Popup in MapMarkerPopup on the python-side(not in kv file) in kivy-Garden-Mapview

我去了 MapView-Doncumentation and also to the Source code 但这似乎没什么用。

我在 kv 文件中创建了这个模板,这样我就可以在地图中动态创建一个 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有一个函数"add_marker"但是通过这个方法我不能添加图像和标签。

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 = "Whosebug")))

else: pass

但它显示此错误:

marker._layer = self
AttributeError: 'NoneType' object has no attribute '_layer'

你问这个问题已经有一段时间了,但我最近遇到了同样的问题,也许有人对答案感兴趣。您在其他地方指出了如何动态添加内容 (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

即添加最后三行对我有用。