【问题标题】:Integrate Screen Manager Widget with MapView将屏幕管理器小部件与 MapView 集成
【发布时间】:2020-06-13 17:19:36
【问题描述】:

应用的概念

我正在尝试创建一个在初始阶段将包含 2 个窗口的应用程序。

第一个窗口 (LoginScreen) 是一个带有按钮的登录窗口,当您单击该按钮时,它会将您带到第二个窗口。

第二个窗口 (MapScreen) 应该使用 MapView 小部件显示地图。

问题描述

启动应用程序后,LoginScreen 正常工作。

移动到 MapScreen 后,只有没有地图的 MapMarketPopup 小部件可见。

代码

main.py

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen

class LoginScreen(Screen):
    pass

class MapScreen(Screen):
    pass

GUI = Builder.load_file("main.kv")

class MainApp(App):
    def build(self):
        return GUI

    def change_screen(self, screen_name):
        screen_manager = self.root.ids['screen_manager']
        # screen_manager.transition = WipeTransition()
        screen_manager.current = screen_name

MainApp().run()

main.kv

#:include loginscreen.kv
#:include mapscreen.kv

GridLayout:
    cols: 1
    ScreenManager:
        id: screen_manager
        LoginScreen:
            name: "login_screen"
            id: login_screen
        MapScreen:
            name: "map_screen"
            id: map_screen

loginscreen.kv

<LoginScreen>:
    Button:
        text: "Go to MapScreen"
        on_press: app.change_screen("map_screen")

mapscreen.kv

#:import MapView kivy.garden.mapview.MapView

<MapScreen@MapView>:
    lat: 52
    lon: 21
    zoom: 10
    double_tap_zoom: True
    on_lat:
        print(self.lat)
    on_lon:
        print(self.lon)
    MapMarkerPopup:
        lat: 52
        lon: 21
        Button:
            on_release:
                root.center_on(52,21)
                print(root.get_bbox())

问题

有谁知道我在哪里犯了错误以及如何改正?

【问题讨论】:

  • 更好的方法是包含一个MapView 小部件作为MapScreen 的子小部件,而不是扩展MapView

标签: python kivy kivy-language


【解决方案1】:

解决方案

我解决这个问题的方法是创建一个动态类。

MapScreen 是我的第二个屏幕对象,MapView 小部件用作 MapScreen 的子级。

代码

mapscreen.kv

#:import MapView kivy.garden.mapview.MapView

<MapScreen@Screen>:
    MapView:
        lat: 10
        lon: 10
        zoom: 10
        double_tap_zoom: True
        on_lat:
            print(self.lat)
        on_lon:
            print(self.lon)
        MapMarkerPopup:
            lat: 10
            lon: 10
            Button:
                on_release:
                    root.center_on(52,21)
                    print(root.get_bbox())

额外评论

我还发现,当我创建动态类时,我不需要在 main.py 中声明类。

【讨论】:

    猜你喜欢
    • 2022-11-13
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    相关资源
    最近更新 更多