在 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
即添加最后三行对我有用。
我去了 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
即添加最后三行对我有用。