在 Kivy 文件和 python 文件中使用 ScreenManager

问题描述

我是 Kivy 的新手,我正在开发一个用于车辆维修的跟踪应用程序,我有一个约会列表,当您按下列表中的一个项目时,我正在尝试转到另一个屏幕,然后我不知道为什么它对我不起作用,因为它说它在不同的屏幕上,但不在应用程序上

from kivymd.app import MDApp
from kivy.lang.builder import Builder
from kivymd.uix.list import ThreeLineAvatarIconListItem
from kivymd.uix.list import ImageLeftWidget
from kivy.uix.screenmanager import Screen,ScreenManager,SwapTransition,CardTransition
from kivy.core.window import Window
import sqlite3

DatabaseConnection = sqlite3.connect('CarWorkshopDB.db')
cursor = DatabaseConnection.cursor()

Window.size= (400,650)

class MainScreen(Screen):
    pass

class AddScreen(Screen):
    pass

class DetailsScreen(Screen):
    pass

class WorkApp(MDApp):
    def build(self):
        self.screen_manager = ScreenManager(transition=CardTransition())
        self.screen_manager.add_widget(MainScreen(name='MainScreen'))
        self.screen_manager.add_widget(AddScreen(name='AddScreen'))
        self.screen_manager.add_widget(DetailsScreen(name='DetailsScreen'))
        screen = Builder.load_file("test2.kv")
        return screen

    def on_start(self):
        client = 'John smith'
        cursor.execute("SELECT TrackingNumber,Plate,Status FROM Appointments WHERE Customer =?",(client,))
        for i in cursor:
            self.new_message(i[0],i[1],i[2])
    
    def new_message(self,TrackingNumber,Vehicle,Process):
        new_message = ThreeLineAvatarIconListItem(text=TrackingNumber,secondary_text=Vehicle,tertiary_text=Process)
        new_message.add_widget(ImageLeftWidget(source='RepairIMG.jpg'))
        new_message.bind(on_release=self.on_touch_down)
        self.root.ids.list.add_widget(new_message)
        
    def on_touch_down(self,x):
        print(self.screen_manager.current)
        self.screen_manager.current = "DetailsScreen"
        self.screen_manager.transition.direction = 'right'
        print(self.screen_manager.current)
WorkApp().run()

这是kv文件中的列表代码

    NavigationLayout:
        ScreenManager:
            id: screen_manager
            MainScreen:
                name : "MainScreen"
                BoxLayout:
                    orientation:'vertical'
                    MDBottomNavigation:
                        panel_color: 1,.643,1
                        MDBottomNavigationItem:
                            name: 'screen 1'
                            text: 'Home'
                            icon: 'alpha-h-circle'
                            MDToolbar:
                                title: 'Add Repair'
                                md_bg_color: 1,1
                                elevation: 6
                                pos_hint: {'top':1}
                            Widget:
                        MDBottomNavigationItem:
                            name: 'screen 2'
                            text: 'Track'
                            icon: 'alpha-t-circle'
                            MDToolbar:
                                id: toolbar
                                title: 'Track History'
                                md_bg_color: 1,1
                                elevation: 6
                                pos_hint: {'top':1}
                            NavigationLayout:
                                x: toolbar.height
                                size_hint_y: 1.0 - toolbar.height/root.height
                                ScreenManager:
                                    Screen:
                                        name: 'ScrollViewScreen'
                                        ScrollView:
                                            MDList:
                                                id: list
                            MDFloatingActionButton:
                                icon: 'plus'
                                md_bg_color: 1,1
                                on_release: 
                                    screen_manager.current = 'AddScreen'
                                    screen_manager.transition = CardTransition()
                                    screen_manager.transition.direction = "down"
                                pos_hint: {'x': .84,'y': .02}
                        MDBottomNavigationItem:
                            name: 'screen 4'
                            text: 'More'
                            icon: 'dots-horizontal'
                            MDToolbar:
                                title: 'More'
                                md_bg_color: 1,1
                                elevation: 6
                                pos_hint: {'top':1}
                            Widget:
                            MDLabel:
                                text: 'dfsfdsf'
                                halign: 'center'
                    
            AddScreen:
                name: 'AddScreen'
                id: Add
                FloatLayout:
                    orientation: 'vertical'
                    MDToolbar:
                        id: toolbar2
                        title: 'Add Tracking Number'
                        md_bg_color: 1,1
                        elevation: 6
                        pos_hint: {'top':1}
                    MDIconButton:
                        icon : 'close'
                        pos_hint : {'top':0.98,'x':0.85}
                        on_release : 
                            screen_manager.current = "Main"
                            screen_manager.transition = CardTransition()
                            screen_manager.transition.direction = "up"
                    FloatLayout:
                        x: toolbar2.height
                        size_hint_y: 1.0 - toolbar.height/root.height
                        ScatterLayout:
                            MDLabel:
                                text: 'Track Repair'
                                font_style: 'H4'
                                valign: 'top'
                                pos_hint: {'top':1}
                                text_size: self.size
                                size_hint: None,None
                            MDTextFieldRound:
                                icon_left: 'alpha-t-circle'
                                hint_text: 'Tracking Number'
                                normal_color: 1,1
                                pos_hint: {'y':.7}
                                text_size: self.size
                            MDTextFieldRound:
                                icon_left: 'alpha-p-circle'
                                hint_text: 'Postcode'
                                normal_color: 1,1
                                pos_hint: {'y':.6}
                                text_size: self.size
                            MDTextButton:
                                text: "Cant find your tracking number?"
                                custom_color: 1,1
                                pos_hint: {'y':.5}
                                halign: 'center'
                            MDRectangleFlatButton:
                                text: 'confirm'
                                pos_hint: {'y':.4}
                                valign: 'middle'
                                text_size: self.size
            
            DetailsScreen:
                name: 'DetailsScreen'
                id: Details
                BoxLayout:
                    orientation: 'vertical'
                    MDLabel:
                        text: 'details Screen?'

解决方法

问题在于,在您的 build() 方法中,您正在构建一个小部件树:

    self.screen_manager = ScreenManager(transition=CardTransition())
    self.screen_manager.add_widget(MainScreen(name='MainScreen'))
    self.screen_manager.add_widget(AddScreen(name='AddScreen'))
    self.screen_manager.add_widget(DetailsScreen(name='DetailsScreen'))

但是您的 GUI 中未使用此小部件树。 GUI 中的小部件树是从 kv 文件通过以下方式构建的:

screen = Builder.load_file("test2.kv")

当您的代码尝试使用以下方法更改当前 Screen 时:

self.screen_manager.current = "DetailsScreen"

它正在更改不在您的 GUI 中的 Screen 的当前 ScreenManager

解决方法是为 self.screen_manager 分配正确的值,如下所示:

class WorkApp(MDApp):
    def build(self):
        screen = Builder.load_file("test2.kv")
        self.screen_manager = screen.ids.screen_manager
        return screen