将Screen Manager小部件与MapView集成

2024-09-28 17:19:45 发布

您现在位置:Python中文网/ 问答频道 /正文

应用的概念

我正在尝试创建一个应用程序,它在初始阶段将由两个窗口组成

第一个窗口(LoginScreen)是一个带有按钮的登录窗口,单击该按钮可进入第二个窗口

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

问题的描述

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

移动到MapScreen后,只有MapMarketPopup小部件(不带地图)可见

This is how it looks like.

代码

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())

问题:

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


Tags: namefromimportselfmainonmanagerscreen
1条回答
网友
1楼 · 发布于 2024-09-28 17:19:45

解决方案

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

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中声明类

相关问题 更多 >